题目详情‘
本题是一道经典的DFS递归索引问题;判断8个方向;同样是经典的种子填充问题;使用两种方法,归根究底两种方法一致我本人比较喜欢第一种;
代码一、
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
char s[maxn][maxn];
int a[maxn][maxn];
int m,n;
int dir[8][2]={{1,0},{1,1},{1,-1},{-1,0},{-1,-1},{-1,1},{0,1},{0,-1}};//储存方向
void dfs(int x,int y,int num)//递归函数
{
for(int i=0;i<8;i++)//进行八个方向的判断
{
int ii=x+dir[i][0];//更新坐标
int jj=y+dir[i][1];
if(a[ii][jj]==0&&s[ii][jj]=='@'&&ii>=0&&jj>=0&&ii<m&&jj<n)
{
a[ii][jj]=num;
dfs(ii,jj,num);
}
}
}
int main()
{
while(cin>>m>>n&&m!=0)
{
int num=0;
memset(a,0,sizeof(a));
for(int i=0;i<m;i++)
scanf("%s",s[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(s[i][j]=='@'&&a[i][j]==0)
{
a[i][j]=++num;//这里也可以将a[i][j]等于某一定值比如1;
dfs(i,j,num);
}
}
cout<<num<<endl;
}
}
代码二、这里不过多赘述,因为我不喜欢
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
char s[maxn][maxn];
int a[maxn][maxn];
int m,n;
void dfs(int x,int y,int num)
{
if(x<0||y<0||x>=m||y>=n) return;
if(a[x][y]!=0||s[x][y]!='@') return;
a[x][y]=num;
for(int i=-1;i<2;i++)
for(int j=-1;j<2;j++)
{
if(i!=0||j!=0)
{
dfs(x+i,y+j,num);
}
}
}
int main()
{
while(cin>>m>>n&&m!=0)
{
memset(a,0,sizeof(a));
int num=0;
for(int i=0;i<m;i++)
scanf("%s",s[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(a[i][j]==0&&s[i][j]=='@')
dfs(i,j,++num);
cout<<num<<endl;
}
return 0;
}