どこでもドア:http://acm.hdu.edu.cn/showproblem.php?pid=1312
就是吃豆豆的游戏。。’#’是墙,’.’是豆豆,’@’是怪兽。注意启始位置已经吃了一个豆豆。
AC CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include<sstream>
#include<set>
#include <cstdlib>
#include<map>
using namespace std;
const int M=25;
int n,m,ans,sx,sy,vis[M][M];
char ma[M][M];
int dir[4][2]={1,0,0,1,-1,0,0,-1};//上下左右四个方向
void DFS(int x,int y)
{
for(int k=0;k<4;k++)
{
int nx=x+dir[k][0];
int ny=y+dir[k][1];
//不越界不是墙就合法(此处可优化:不用判断访问状态,吃过的豆豆直接变成墙)
if(nx>=0&&ny>=0&&nx<n&&ny<m&&!vis[nx][ny]&&ma[nx][ny]!='#')
{
vis[nx][ny]=1;
ans++;
DFS(nx,ny);
}
}
return ;
}
int main()
{
while(cin>>m>>n)
{
string str;
memset(vis,0,sizeof(vis));
ans=1; //启始位置已经吃了一个豆豆
if(n==0&&m==0)
break;
for(int i=0;i<n;i++)
{
cin>>str;
for(int j=0;j<m;j++)
{
ma[i][j]=str[j];
//记录启始位置
if(ma[i][j]=='@')
{
sx=i;
sy=j;
}
}
}
vis[sx][sy]=1;
DFS(sx,sy);
cout<<ans<<endl;
}
return 0;
}