与上一篇博客写的题目类似,但判断条件更加简单,将上一次的代码修改下即可,依旧使用深度优先:
#include<stdio.h>
int a[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//a控制八个方向
char s[101][101]={0};
int n,m;
void dfs(int i,int j)
{
int aa,bb;
if(s[i][j]=='W')//匹配成功
{
s[i][j]='.';
for(int t=0;t<8;t++)
{
aa=i+a[t][0];
bb=j+a[t][1];
if(aa>n||bb>m) continue ;
dfs(aa,bb);
}
}
return ;
}
int main()
{
int ans=0;
scanf("%d %d",&n,&m);
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%c",&s[i][j]);
getchar();
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(s[i][j]=='W')
{dfs(i,j);ans++;}
}
printf("%d",ans);
return 0;
}
不足:
- n和m太随意,与平常使用的行m列n混淆,从而行列互调,导致出现bug;
- 读取字符矩阵用%s读取一行可以避免对回车的单独处理,更加简洁。