本题运用深搜可做,应该广搜也可以,我写了一下,wa,不过深搜简单多了,注意再8种情况遍历的地方,要使用x+d[i][0]代入,x+=d[i][0],出错
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000;
char str[maxn][maxn];
int d[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
int n,m,cnt,k;
void dfs(int x,int y)
{
if(x<0||x>n-1||y<0||y>m-1||str[x][y]!='@')
return;
str[x][y]='*';
for(int i=0;i<8;i++)
{
dfs(x+d[i][0],y+d[i][1]);
}
}
int main()
{
//freopen("L.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
cnt=0;
for(int i=0;i<n;i++)
scanf("%s",&str[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(str[i][j]=='@')
{
dfs(i,j);
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
出错广搜代码
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000;
int vis[maxn][maxn];
char str[maxn][maxn];
int d[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
struct node{
int x,y,cnt;
}from[maxn];
int n,m,cnt,k;
void bfs(int x,int y)
{
queue<node> q;
node st;
st.x=x,st.y=y,st.cnt=0;
q.push(st);
vis[x][y]=1;
while(!q.empty())
{
node rh=q.front();q.pop();
for(int i=0;i<8;i++)
{
int xx=rh.x,yy=rh.y;
xx+=d[i][0];yy+=d[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0&&str[xx][yy]=='@')
{
//cout<<xx<<yy<<endl;
node ths;
ths.x=xx,ths.y=yy;
vis[xx][yy]=1;
q.push(ths);
}
}
}
}
void init()
{
memset(vis,0,sizeof(vis));
cnt=0;
k=0;
}
int main()
{
freopen("L.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
//cout<<n<<m<<endl;
if(n==0&&m==0) break;
init();
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>str[i][j];
//cout<<str[i][j]<<endl;
if(str[i][j]=='@')
{
from[k].x=i;
from[k].y=j;
from[k++].cnt=0;
}
}
//cout<<k<<endl;
for(int i=0;i<k;i++)
{
int x=from[i].x;
int y=from[i].y;
// cout<<x<<y<<endl;
if(!vis[x][y])
{
bfs(x,y);
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}