HDU 1241
http://acm.hdu.edu.cn/showproblem.php?pid=1241
BFS 横着,竖着或斜着相连都是一组 一共有几组?
本来很基础的一道搜索 可是有一个地方错误 找了一晚上 while(beg<end) 错写为了
while(beg<=end)
这道题我用的BFS 还可以DFS 并查集也可以做
敲了俩代码 改了一晚上 贴一下吧
(一)BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
char a[110][110];
//{-1,0,1,-1,1,-1,0,1},YY[8]={-1,-1,-1,0,0,1,1,1};
int XX[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
int R,C;
struct node{int x, y;}t,tt;
void bfs(int r,int c,int num)
{
queue<node>qu;
int xx,yy,k,beg,end;
t.x=r,t.y=c;
qu.push(t);
a[r][c]='*';
while(!qu.empty())
{
t=qu.front();
qu.pop();
for(k=0;k<8;k++)
{
xx=t.x+XX[k][0], yy=t.y+XX[k][1];
if(a[xx][yy]=='@')
{
tt.x=xx,tt.y=yy;
qu.push(tt);
a[xx][yy]='*';
//num++;
// if(num==100)return;!!!真晕 加上就错
}
}
}
return ;
}
int main()
{
int i,j,sum;
while(scanf("%d%d",&R,&C)!=EOF&&(R+C))
{
memset(a,0,sizeof(a));
for(i=1;i<=R;i++)
scanf("%s",a[i]+1);
sum=0;
for(i=1;i<=R;i++)
for(j=1;j<=C;j++)
{
if(a[i][j]=='@')
{
sum++;
bfs(i,j,1);
}
}
printf("%d\n",sum);
}
return 0;
}
(二) BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
char a[102][102];
int visit[102][102];
int XX[8]={-1,0,1,-1,1,-1,0,1},YY[8]={-1,-1,-1,0,0,1,1,1};
int R,C;
struct{int x, y;}qu[10005];
void bfs(int r,int c,int num)
{
int xx,yy,k,beg,end;
visit[r][c]=1;
beg=0;end=1;
qu[1].x=r,qu[1].y=c;
while(beg<end)
{
int f=++beg;
for(k=0;k<8;k++)
{
xx=qu[f].x+XX[k], yy=qu[f].y+YY[k];
if(xx<0||xx>=R||yy<0||yy>=C)continue;
if(a[xx][yy]=='*')continue;
if(visit[xx][yy])continue;
if(!visit[xx][yy])
{
end++;
qu[end].x=xx,qu[end].y=yy;
visit[xx][yy]=1;
// num++;
// if(num==100)return;
}
}
}
return ;
}
int main()
{
int i,j,sum;
while(scanf("%d%d",&R,&C)!=EOF&&(R+C))
{
for(i=0;i<R;i++)
scanf("%s",a[i]);
memset(visit,0,sizeof(visit));
sum=0;
for(i=0;i<R;i++)
for(j=0;j<C;j++)
{
if(!visit[i][j]&&a[i][j]=='@')
{
sum++;
bfs(i,j,1);
}
}
printf("%d\n",sum);
}
return 0;
}