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