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 map[110][110]; void dfs(int i,int j) { if(map[i-1][j]){map[i-1][j]=0;dfs(i-1,j);} if(map[i+1][j]){map[i+1][j]=0;dfs(i+1,j); } if(map[i][j+1]){ map[i][j+1]=0;dfs(i,j+1); } if(map[i][j-1]) { map[i][j-1]=0;dfs(i,j-1); } } int main() { int t; int i,j; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } int cnt=0; for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { if(map[i][j]) { map[i][j]=0; cnt++; dfs(i,j); } } } printf("%d\n",cnt); } return 0; }稍微简化一点的版本:
#include<stdio.h> #include<string.h> int b[2][4]={0,1,0,-1,1,0,-1,0}; int map[110][110]; void dfs(int x,int y) { map[x][y]=0; for(int i=0;i<4;++i) { if(map[x+b[0][i]][y+b[1][i]]) { dfs(x+b[0][i],y+b[1][i]); } } } int main() { int t; scanf("%d",&t); while(t--) { int n,m; int cnt=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(map[i][j]) { cnt++; dfs(i,j); } } } printf("%d\n",cnt); } return 0; }试了一下广搜,发现也可以!
//法三: #include<stdio.h> #include<queue> using namespace std; typedef struct { int i,j; }node; int map[110][110]; int cnt; int b[2][4]={0,1,0,-1,1,0,-1,0}; queue<node>q; int n,m; void bfs() { for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(map[i][j]) { map[i][j]=0; node u={i,j}; q.push(u); cnt++; while(!q.empty()) { u=q.front(); q.pop(); for(int k=0;k<4;++k) { if(map[u.i+b[0][k]][u.j+b[1][k]]) { node v={u.i+b[0][k],u.j+b[1][k]}; q.push(v); map[v.i][v.j]=0; } } } while(!q.empty()) q.pop(); } } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { scanf("%d",&map[i][j]); } } cnt=0; bfs(); printf("%d\n",cnt); } return 0; }
原文地址:http://blog.csdn.net/ice_alone/article/details/44903117