http://ybt.ssoier.cn:8088/problem_show.php?pid=1329
方法一:DFS
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n, m; 4 char c; 5 char a[1000][1000]; 6 int nex[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 7 int ans; 8 void testpr(){ 9 cout<<"----------"<<endl; 10 for(int i=0; i<n; i++){ //输出测试 11 for(int j=0; j<m; j++) 12 cout<<a[i][j]; 13 cout<<endl; 14 } 15 } 16 void dfs(int x, int y){ 17 //testpr();//用于测试访问过程 18 for(int i=0; i<4; i++){ 19 int nx=x+nex[i][0]; 20 int ny=y+nex[i][1]; 21 //if(nx<0 || nx>n-1 || ny<0 || ny>m-1)continue;//判断是否越界 22 if(nx>=0 && nx<n && ny>=0 && ny<m && a[nx][ny]!='0')//判断是否为细胞 23 { 24 a[nx][ny]='0'; 25 dfs(nx, ny); 26 } 27 } 28 } 29 int main() 30 { 31 cin>>n>>m; 32 getchar(); //过滤m后面的换行符 33 for(int i=0; i<n; i++){ 34 for(int j=0; j<m; j++){ 35 cin>>a[i][j]; 36 } 37 getchar(); //过滤每行后面的换行符 38 } 39 //testpr();//测试输入有无问题 40 for(int i=0; i<n; i++){ //找非0的点 41 for(int j=0; j<m; j++){ 42 if(a[i][j]!='0'){ 43 ans++; 44 dfs(i, j);//从非0点开始搜索,搜索所到点都更改为0 45 } 46 } 47 } 48 cout<<ans; 49 return 0; 50 }
方法二:BFS
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n, m, ans; 4 char a[60][60]; 5 struct node{ //结构体定义位置坐标 6 int x, y; 7 }; 8 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//二维数组表示上下左右四个方向 9 node que[3600];//结构体数组存储队列 10 int f, r;//队首、队尾 11 void bfs(int x, int y){ 12 f=r=1;//初始化 13 que[r].x=x, que[r].y=y, a[x][y]='0';//非0数字坐标入队 14 while(f<=r){ 15 node t; //定义临时变量t来存放队首信息 16 t.x=que[f].x, t.y=que[f].y; 17 for(int i=0; i<4; i++){ //四个方向遍历 18 int nx=t.x+dir[i][0]; 19 int ny=t.y+dir[i][1]; 20 if(nx>=0 && nx<n && ny>=0 && ny<m && a[nx][ny]!='0'){//判断是否符合入队条件 21 a[nx][ny]='0'; 22 r++; //队尾后移准备入队 23 que[r].x=nx; //入队 24 que[r].y=ny; //入队 25 } 26 } 27 f++;//队首出队列 28 } 29 } 30 int main() 31 { 32 cin>>n>>m; 33 for(int i=0; i<n; i++)cin>>a[i]; 34 for(int i=0; i<n; i++){ 35 for(int j=0; j<m; j++){ 36 if(a[i][j]!='0'){ 37 ans++; 38 bfs(i, j); 39 } 40 } 41 } 42 cout<<ans; 43 return 0; 44 }