/*有一個大小為N*M的園子,雨後積了水
八連通的水被認為是聯通在一起的
請 求出院子裡總共有多少水窪?
#代表有水 .代表無水
EG:
...
.#.
... 隻有當#周圍全為. 才認定這是一個水窪
N,M<=100
解:就是深度周遊 在經過一個有@的點時深度周遊
并把此點标記或者更改 在主函數中完整的調用周遊的次數就是 水窪的個數
*/
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define N 15
# define M 30
char TU[N][M],S[]={".#"};
void DFS(int X,int Y);
int main(){
int i,j,SUM=0;
srand(time(NULL));
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
TU[i][j]=S[rand()%10>=6]; //為了降低#的比重 用了[rand()%10>=6]
printf("%c",TU[i][j]);
}
printf("\n");
}
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
if(TU[i][j]=='#')
{
DFS(i,j);
SUM++;
}
}
printf("\n共有%d個水窪.",SUM);
return 0;
}
void DFS(int X,int Y)
{
int i,j,x,y;
TU[X][Y]='.';//将其改為'.'這樣就相當于做了标記
for(i=-1;i<=1;i++) //用i j 加上目前X Y的坐标 來表示(X,Y)周圍的坐标
for(j=-1;j<=1;j++)
{
x=X+i; //
y=Y+j; //x y用來儲存移動的結果
if(TU[x][y]=='#'&&x>=0&&x<N&&y>=0&&y<M)
DFS(x,y); //深度周遊
}
return;
}
附加小程式:
年月日轉天數,天數轉月日
相信大家對此都不陌生此程式隻是增加了pai錯功能:
代碼雖少 五髒俱全
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLkJXY3t2dh9CX0xWdhZWZk9CX09Wbl9lcvRXakVGa49CXy9GdpRWZoh3LcRXZu5ibkN3Yuc2bsJmLjlGdhR3cvw1LcpDc0RHaiojIsJye.gif)
:
用了循環輸入年月日,共70行代碼
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main()
{
long a[4]={0,0,0,0},i,tianshu,yuetian=0; //a[0]a[1]a[2]a[3]分别存放選擇年月日,i為循環變量;tianshu記錄天數,yuetian用于将天數轉為月日
int choice=3,flag,pan=0; //循環次數,暫時定為2,閏年時flag=1,平年時flag=0,pan用來決定使用者輸入的年月日區間
char zifu[][5]={"選擇","年份","\0","天數"}; //月份的暫時先為\0 ,如果是天數就把xuan[0]複制給zifu[2];
char xuan[][5]={"天數","月份","\0\0\0\0"},lei[][3]={"平","閏"}; //複制給zifu[2]的字元串
int month[]={31,28,31,30,31,30,31,31,30,31,30,31}; //十二個月,二月暫定為28
int charge [2][8]={{1,1,1,1,3,2016,365,0},{1,1,1,1,3,2016,12,0}}; //使用者輸入的年月日區間
do{
printf("1:year.day->year.month.day\n2:year.month.day->year.day\n3:exit\n"); //選擇項
for(i=0;i<choice;i++)
{
do{
printf("請輸入%s(%d--%d):\n",zifu[i],charge[pan][i],charge[pan][i+4]);//提示使用者輸入
scanf("%d",&a[i]);
while(getchar()!='\n');//清理緩沖區
if(a[i]>charge[pan][i+4]||a[i]<charge[pan][i])
printf("輸入有誤,");
}while(a[i]>charge[pan][i+4]||a[i]<charge[pan][i]); //使用者輸入不在charge[][]區間時重新輸入
if(i==0) //當使用者選擇完畢時
{
if(a[0]==3) break;
pan=a[0]==3?-3:a[0]-1; //pan進行charge[?][]的判斷
choice+=pan; //改變循環次數 如果是0就跳出循環
strcat(zifu[2],xuan[pan]); //複制xuan[pan]到zifu[2]
}
if(i==1) //當年分輸入完畢時
{
flag=!(a[1]%4&&a[1]%100)||!(a[1]%400)?1:0; //如果年份是閏年flag =1否則為0
month[1]+=flag; //二月+flag
charge[0][6]+=flag; // 365+flag
}
if(i==2)
charge[1][7]=month[a[2]-1]; //當月份輸入完畢時charge[1][8]改為month[a[2]-1]
}
if(a[0]==2)
{
printf("%04d年--<%s年>\n%02d月%02d日",a[1],lei[flag],a[2],a[3]); //輸出年月日
tianshu=a[3]; //求天數
for(i=0;i<a[2]-1;i++)
tianshu+=month[i];
printf("是第%d天\n",tianshu); //輸出天數
}
if(a[0]==1)
{
printf("%04d年--<%s年>\n第%d天",a[1],lei[flag],a[2]); //和上面一樣
for(i=0;i<12;i++)
{
charge[0][6]-=month[i]; //charge[0][6]已經在運作過程中改為365或366是總天數
if(charge[0][6]<a[2]) //當總天數<a[2]時跳出循環
break;
}
a[3]=a[2]-charge[0][6]; //剩餘的天數就是 日 ,
a[2]=12-i; //求月
printf("是%02d月%d日\n",a[2],a[3]); //輸出
}
if(a[0]-3)
{
system("pause");
for(i=0;i<4;i++)
{
zifu[2][i]='\0';
a[i]=0;
}//将字元數組xuan[]複制到zifu[2]的清零
month[1]=28;charge[1][7]=0;charge[0][6]=365;choice=3;tianshu=0;
}
system("cls");
}while(a[0]-3);
}