题意:就是让你从起点“@”开始遍历所有能走到的“.”,可以按原路返回,但不再计数。注意:先输入的w是列数,后输入的h是行数。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int w,h,ans,a,b;
char map[25][25];
bool vis[25][25];//辅助数组,走过的记为true,避免重复计算,陷入死循环
int px[4]={-1,0,1,0};
int py[4]={0,1,0,-1};
int dfs(int a,int b){
for(int i=0;i<4;i++){
int x=a+px[i];
int y=b+py[i];//移动后的位置
if(map[x][y]=='.'&&vis[x][y]==false){
vis[x][y]=true;
ans++;//计数器
dfs(x,y);//递归调用自身,遍历完所有情况
}
}
return ans;
}
int main(){
while(scanf("%d%d",&w,&h),w||h){
memset(vis,false,sizeof(vis));//辅助数组初始化
memset(map,'#',sizeof(map));//将图全部初始化为#,防止越界
ans=0;//计数器初始化
for(int i=1;i<=h;i++){//从1开始!!
getchar();//吸收空行键
for(int j=1;j<=w;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='@'){
a=i,b=j;
vis[i][j]=true;//记录@的位置,即dfs的起点
}
}
}
printf("%d\n",dfs(a,b)+1);//加上@本身的位置
}
return 0;
}