广度搜索(2)
Description
Input
Output
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=150;
char map[maxn][maxn];
bool vis[maxn][maxn];
int qx[maxn*maxn],qy[maxn*maxn];
int dir[8][2]= {{1,0},{-1,0},{0,1},{0,-1},{-1,1},{-1,-1},{1,1},{1,-1}};
int n,m,ans;
void bfs()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(map[i][j]=='@'&&vis[i][j]==0)
{
ans++;
int l=0,r=0;
qx[r]=i,qy[r++]=j;
vis[i][j]=1;
while(l<r)
{
int curx=qx[l],cury=qy[l++];
for(int t=0;t<8;t++)
{
int nx=curx+dir[t][0];
int ny=cury+dir[t][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny]&&map[nx][ny]=='@')
{
vis[nx][ny]=1;
qx[r]=nx,qy[r++]=ny;
}
}
}
}
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)==2&&(n||m))
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>map[i][j];
ans=0;
memset(vis,0,sizeof(vis));
bfs();
printf("%d\n",ans);
}
return 0;
}
深搜代码:
int p[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
char ch[101][101];
int m,n;
void search(int x,int y)
{
int i,xx,yy;
for(i=0;i<8;i++)
{
xx=x+p[i][0];yy=y+p[i][1];
if(xx<0||xx>=m||yy<0||yy>=n) continue;
if(ch[xx][yy]=='*')continue;
ch[xx][yy]='*';
search(xx,yy);
}
}
{
int i,j,count;
while(scanf("%d%d",&m,&n)&&m+n)
{
for(i=0;i<M;I++) scanf(?%s?,ch[i]);
count=0;
for(i=0;i<M;I++)
for(j=0;j<N;J++)
{
if(ch[i][j]=='@')
{search(i,j);count++;}
}
printf("%d\n",count);
}
}