2 3 4 1 0 0 0 0 0 1 1 1 1 1 0 5 5 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1
2 3
#include<stdio.h> int a[200][200]; int dx[4]={0,0,1,-1};//方向数组 int dy[4]={1,-1,0,0}; void bfs(int x,int y) { a[x][y]=0;//水池要马上变成陆地防止无限进入函数 for(int k=0;k<4;k++) { int sx=x+dx[k];//任意一个这个点的上下左右 int sy=y+dy[k]; if(a[sx][sy]==1)//如果又是水池再次进入函数 bfs(sx,sy); } } int main() { int T,j,i,n,m,count; scanf("%d",&T); while(T--) { count=0; scanf("%d %d",&m,&n);//m行n列 for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]);//输入水池分布情况1为有水池,0为没有水池 } } for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(a[i][j]==1) { bfs(i,j);//如果有水池看看周边有没有水池这样可以算成一个大水池 count++;//判断结束后跳出最后一层函数,已经知道大水池有几个小水池构成,要输出水池数目,所以要自增 } } } printf("%d\n",count); } return 0; }
最少步数
时间限制: 3000 ms | 内存限制: 65535 KB难度: 4
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
2 3 1 5 7 3 1 6 7
12 11
#include<stdio.h> #define INF 0xfffffff//最大值一个零一个x七个f int dx[4]={0,0,1,-1};// 以进入函数的点为零点 ,四个方向 上下左右 int dy[4]={1,-1,0,0};// int ex,ey,x,y,min,c; int map[9][9]={//二维数组记录迷宫的情况 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; void dfs(int x,int y,int c) { int i,s,t; if(x==ex&&y==ey&&c<min) { min=c; } for(i=0;i<4;i++) { int s=x+dx[i];//任意一个这个点的上下左右 int t=y+dy[i]; if(map[s][t]==0&&c+1<min)//判断是否是通路 { map[s][t]=1;//如果是通路步数加1立马给封死, dfs(s,t,c+1);//进入下一步,如果是通路继续判断下下一步而且要步数加1,如果碰到的是墙要跳出函数执行下一步 map[s][t]=0;//要把以前的断路重新变成通路才好改变方向继续走 } } } int main() { int T,i,j; scanf("%d",&T); while(T--) { scanf("%d %d %d %d",&x,&y,&ex,&ey); min=INF;//把最小值设成无限大 map[x][y]=1;//从起点开始就要把起点的0改成1,就是防止一直进入dfs c=0;//记录步数 dfs(x,y,c);//进入dfs函数 map[x][y]=0;//如果从一开始就碰壁,那么就从一开始改变方向 printf("%d\n",min); } return 0; }