今天做了一个挺有趣的问题,下面我将叙述并给出结题代码
#include<bits/stdc++.h>
using namespace std;
char a[101][101];
int n,m;
int sum=0;
void judge(int x,int y)//用于判定第x行第y列相邻8个单元
{
int i,j;
a[x][y]='.';//a[x][y]已经判定过,将其赋值为“.”在下一次判定是直接跳过
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if((a[i][j]=='W'))
/*if((a[i][j]=='W')&&(i>0)&&(i<=n)&&(j>0)&&(j<=m))最初此处的判定方式如左,在定义a[][]时参数范围为a[100][100]
之后扩大了二元字符数组的范围,令数据被空数值围绕,在判定时相当于自主跳过;
*/
{
judge(i,j);
}
}
}
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]=='W')
{
sum++;//判定为W时湖泊数加一
judge(i,j);
}
}
}
cout<<sum<<endl;
return 0;
}
解题思路:
我最初的解题想法是,在定义一个数组b[101][101]与a[101][101]对应,在a[i][j]判定后将b[i][j]置1,当b[i][j]=1时表示a[i][j]已判定过。在判定a[i][j]=='W'时连带判定b[i][j]!='1',以此作为判定结束条件。