题意:给你图案,判断有多少个 @ ,如果 @与@相邻对角垂直,则会被算成一个。
思路:遍历 图案,找到 @,对其四周进行递归,并每一次执行,都把其原来图案换点。
结束条件,如果四周都没有@ 即可退出 深搜水题,做法也比较随意。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=120;
char Val[maxn][maxn];
void DFS(int x,int y){
bool Flag=0;
Val[x][y]='*';
if(Val[x+1][y]=='@'){
DFS(x+1,y);
Flag=1;
}
if(Val[x+1][y-1]=='@'){
DFS(x+1,y-1);
Flag=1;
}
if(Val[x+1][y+1]=='@'){
DFS(x+1,y+1);
Flag=1;
}
if(Val[x-1][y]=='@'){
DFS(x-1,y);
Flag=1;
}
if(Val[x-1][y-1]=='@'){
DFS(x-1,y-1);
Flag=1;
}
if(Val[x-1][y+1]=='@'){
DFS(x-1,y+1);
Flag=1;
}
if(Val[x][y-1]=='@'){
DFS(x,y-1);
Flag=1;
}
if(Val[x][y+1]=='@'){
DFS(x,y+1);
Flag=1;
}
if(!Flag){
return;
}
}
int main(){
int n,m;
while(~scanf("%d %d",&n,&m) && n,m){
memset(Val,'0',sizeof(Val));
int w=0,num=0;
for(int i=0;i<n;++i){
scanf("%s",Val[i]);
}
int x,y;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(Val[i][j]=='@'){
num++;
DFS(i,j);
}
}
}
printf("%d\n",num);
}
return 0;
}