这道题就是给你一个二维数组,‘@’周围八个方向的‘@’都是属于同一块区域,问这个二维数组被分为几个区域。简单的BFS,直接向八个方向搜索,BFS与DFS两种方法我都写了,BFS代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char map[105][105];
int vis[105][105];
int n,m;
int d[8][2]={{0,1},{0,-1},{1,0},{-1,0},
{1,1},{-1,-1},{-1,1},{1,-1}}; //八个方向
struct node{
int x;
int y;
};
void Bfs(int x,int y){
vis[x][y]=1;
queue<node>q;
node s,e;
int i;
s.x=x;
s.y=y;
q.push(s);
while(!q.empty()){
s=q.front();
q.pop();
for(i=0;i<8;i++){
int xx=s.x+d[i][0];
int yy=s.y+d[i][1];
if(xx<0||yy<0||xx>=n||yy>=m)
continue;
if(map[xx][yy]=='*')continue;
if(vis[xx][yy])continue;
vis[xx][yy]=1;
e.x=xx;
e.y=yy;
q.push(e);
}
}
}
int main()
{
int i,j;
int ans;
while(scanf("%d %d",&n,&m)!=EOF){
if(!n&&!m)break;
memset(vis,0,sizeof(vis));
ans=0;
for(i=0;i<n;i++){
scanf("%s",map[i]);
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(map[i][j]=='@'&&!vis[i][j]){
Bfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
DFS代码:
#include<stdio.h>
#include<string.h>
int n,m;
char map[105][105];
int vis[105][105];
int d[8][2]={{0,1},{0,-1},{1,0},{-1,0},
{1,1},{-1,-1},{-1,1},{1,-1}}; //八个方向
void Dfs(int x,int y){
int i;
for(i=0;i<8;i++){
int xx=x+d[i][0];
int yy=y+d[i][1];
if(xx<0||yy<0||xx>=n||yy>=m)
continue;
if(map[xx][yy]=='*')continue;
if(vis[xx][yy])continue;
vis[xx][yy]=1;
Dfs(xx,yy);
}
}
int main()
{
int i,j;
int ans;
while(scanf("%d %d",&n,&m)!=EOF){
if(!n&&!m)break;
ans=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++){
scanf("%s",map[i]);
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(map[i][j]=='@'&&!vis[i][j])
{
Dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
两种方法:第一个是DFS