分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个!!每次可以走上下左右四个方向,求能走到的最大的黑色格子数。
思路:用深度优先遍历从原点起始,一直到遍历所有能到达的格子。注意走过的格子用新符号标记,只要非"."即可。在这里用"#"标记。(也可以再开一个book数组标记走过的为1,没走的为0,但对于本题 没必要这么麻烦,以后的dfs会用到)。
AC代码:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
char g[30][30];
int l,h;
int sx,sy;
int ans;
int dfs(int x,int y)
{
int ans=0;//!!!此处注意重新定义一个ans,而不是赋值0(方法一)。
//方法二:此处可以不重新定义ans,只需要将ans+=dfs(nx,ny);改为ans=dfs(nx,ny);
int dx[5]={0,1,0,-1};
int dy[5]={1,0,-1,0};
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<h&&nx>=0&&ny<l&&ny>=0&&g[nx][ny]=='.')
{
ans++;
g[nx][ny]='#';
ans+=dfs(nx,ny);
}
}
return ans;
}
void solve()
{
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
{
if(g[i][j]=='@')
{
sx=i;
sy=j;
break;
}
}
ans=1+dfs(sx,sy);
cout<<ans<<endl;
}
using namespace std;
int main()
{
while(scanf("%d %d",&l,&h)!=EOF)
{
if(l==0&&h==0) break;
ans=0;
for(int i=0;i<h;i++)// √ !!这样输入超限 for(int i=0;i<h;i++) for(int j=0;j<l;j++) scanf("%c",&g[i][j]); 超限
scanf("%s",g[i]);
solve();
}
}