简单题意
给出一个地图,其中要么是*要么是@,对于@,横、竖、斜连着的成为一个块,问总共有多个@块
解题思路形成过程
深度优先搜索,首先找到第一个@并以他为起点深搜,直到不能搜索为止,为一个块,之后在找到下一个@,在进行深搜,直到整个地图搜索完,为了避免重复,设置一个标记地图,对进行搜索过的点进行标记。
感想
老师上课讲的思路很清楚,不过自己写出来,总有些地方考虑不周
AC代码
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int m,n;
bool visit[110][110];
char map[110][110];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool isbound(int a,int b){
if(a<1||a>m||b<1||b>n)return true;
return false;
}
void dfs(int x,int y){
for(int i=0;i<8;i++){
if(map[x+dir[i][0]][y+dir[i][1]]=='*')continue;
if(isbound(x+dir[i][0],y+dir[i][1]))continue;
if(visit[x+dir[i][0]][y+dir[i][1]])continue;
visit[x+dir[i][0]][y+dir[i][1]]=1;
dfs(x+dir[i][0],y+dir[i][1]);
}
}
int main()
{
ifstream cin("in.txt");
while(cin>>m>>n&&m&&n){
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
int sum=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(map[i][j]=='@'&&!visit[i][j]){
visit[i][j]=1;
dfs(i,j);//¶Ô´ËµãÉîËÑ
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}