https://ac.nowcoder.com/acm/problem/106576
大意就是 X 不能走 . 可以走 @ 是初始位置,然后问从初始位置走完全部的 . 需要的最少步数。
初始化输入很简单,考点是dfs,先找满足条件,在红黑地板范围内 和 没走过 和 可以走 同时满足,走一步,加步数,然后走下一步,走不通了就回溯到上一步可以选择的时候,看其它方向哪里还可以走。
int dir[4][2]={
{1,0},{0,1},{-1,0},{0,-1}
};
char a[25][25];
int vis[25][25];
int i,j,w,h,x,y,ans;
void dfs(int x,int y){
int tx,ty;
for(int k=0;k<4;k++){
tx=x+dir[k][0];
ty=y+dir[k][1];
if(tx>=0&&ty>=0&&ty<w&&tx<h&&vis[tx][ty]==0&&a[tx][ty]=='.'){
ans++;
vis[tx][ty]=1;
dfs(tx,ty);
}
}
}
int main(){
while(cin>>w>>h){
if(w==NULL) break;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
ans=1;
for(i=0;i<h;i++){
for(j=0;j<w;j++){
cin>>a[i][j];
if(a[i][j]=='@'){
x=i;
y=j;
}
}
}
dfs(x,y);
cout<<ans<<endl;
}
return 0;
}