很简单的一道dfs的题,可还是在一些小细节上花了些时间。
题意:只能走black,问从起点一共能走多少块black,可以重复走,但不能重复计数。
要注意一种情况:
2 2
@#
#.
刚开始就在这摔了一跤,考虑还是不全面呀。
下面是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int w,h;
int a[25][25];
int vis[25][25];
int sy,sx;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
int ans;
void dfs(int x,int y)
{
//int flag=0;
int i;
for(i=0; i<4; i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if((tx>=1)&&(tx<=h)&&(ty>=1)&&(ty<=w)&&(!vis[tx][ty])&&a[tx][ty])
{
vis[tx][ty]=1;
ans++;
dfs(tx,ty);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
char x;
while(cin>>w>>h,w&&h)
{
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
ans=0;
for(int i=1; i<=h; i++)
for(int j=1; j<=w; j++)
{
cin>>x;
if(x=='.')
a[i][j]=1;
if(x=='@')
{
a[i][j]=1;
sx=i;
sy=j;
}
}
dfs(sx,sy);
if(ans==0)
cout<<1<<endl;
else
cout<<ans<<endl;
}
return 0;
}