题目大意:
给你一个地图,有两种元素分别为‘.’与‘@’,然后要求你找出不相连的@的个数,@的邻接与@的对角都算是相连的。
解题思路:
广搜的入门题嘛,一开始想的时候,就感觉广搜很靠谱,因为搜相连的,用按层来历遍是比较好的,直接从地图上的每个点开始枚举,如果有一个点为@,那么就以这个点为起始点去开始广搜,然后广搜到它相连的点都标志掉,接着再重复一开始的操作。
吐吐槽:
做完这道题目后才发现,自己没有用到题目上那个一个连通块的@数目不能超过100,没加这个条件也ac了,是不是测试数据有点水……
代码:
#include
#include
const int MAX=105;
using namespace std;
int m,n;
char map[MAX][MAX];
bool visited[MAX][MAX];
typedef struct n
{
int x,y;
}N;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
void BFS(int x,int y)
{
queueQ;
N pre,cur;
pre.x=x;
pre.y=y;
Q.push(pre);
visited[pre.x][pre.y]=true;
while(!Q.empty())
{
pre=Q.front();
Q.pop();
for(int i=0;i<8;i++)
{
cur=pre;
cur.x+=dir[i][0];
cur.y+=dir[i][1];
if(visited[cur.x][cur.y]==false && map[cur.x][cur.y]=='@' && cur.x>=1 && cur.x<=m
&& cur.y>=1 && cur.y<=n)
{
visited[cur.x][cur.y]=true;
Q.push(cur);
}
}
}
}
void init()
{
memset(visited,false,sizeof(visited));
}
int main(void)
{
while(cin>>m>>n,m)//m为行
{
init();
int i,j;
for(i=1;i<=m;i++)
{
scanf("%s",map[i]+1);
}
int count=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(visited[i][j]==false && map[i][j]=='@')
{
BFS(i,j);
count++;
}
}
cout<