这一题是求图中连通块的个数,连通是指八连通,即上下左右和对角线共八个点,可以使用DFS或BFS来解决此题,下面给出两种方式的AC代码:
DFS代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=100+10;
char maze[N][N]; //存储迷宫
int visit[N][N]; //0未访问,1访问过
int dir[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}}; //八连通
int m,n; //行列数
int cnt; //连通块个数
void dfs(int r,int c)
{
for(int i=0;i<8;i++)
{
int nextr=r+dir[i][0];
int nextc=c+dir[i][1];
if(nextr>=0&&nextr<m&&nextc>=0&&nextc<n&&maze[nextr][nextc]=='@'&&!visit[nextr][nextc])
{
visit[nextr][nextc]=1;
dfs(nextr,nextc);
}
}
}
int main()
{
//freopen("test.txt","r",stdin);
while(cin>>m>>n&&m&&n)
{
cnt=0;
memset(maze,'\0',sizeof(maze));
memset(visit,0,sizeof(visit));
for(int i=0;i<m;i++)
scanf("%s",maze[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(maze[i][j]=='@'&&!visit[i][j])
{
dfs(i,j);
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
BFS代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct Node
{
int r;
int c;
Node(int r,int c):r(r),c(c){}
};
queue<Node> q;
const int N=100+10;
int m,n; //行列数
char maze[N][N]; //存储迷宫
int visit[N][N]; //0未访问,1访问过
int dir[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}}; //八连通
int cnt; //连通块个数
void bfs()
{
while(!q.empty())
{
Node node=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int nextr=node.r+dir[i][0];
int nextc=node.c+dir[i][1];
if(nextr>=0&&nextr<m&&nextc>=0&&nextc<n&&maze[nextr][nextc]=='@'&&!visit[nextr][nextc])
{
visit[nextr][nextc]=1;
q.push(Node(nextr,nextc));
}
}
}
}
int main()
{
//freopen("test.txt","r",stdin);
while(cin>>m>>n&&m&&n)
{
cnt=0;
memset(maze,'\0',sizeof(maze));
memset(visit,0,sizeof(visit));
for(int i=0;i<m;i++)
scanf("%s",maze[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(maze[i][j]=='@'&&!visit[i][j])
{
q.push(Node(i,j));
bfs();
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}