6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0Sample Output
45 59 6 13
题目大意:就是从@出发能踩到多少个‘.’,遇到#不能走;
思路:明显是一道dfs,dfs又是递归,所以要有递归边界。。。。
下面是ac代码:(感觉这个写法不是很标准,所以还是用下面那种写法)
#include
#include
#include
using namespace std;
int mp[25][25],vis[25][25],ans,n,m;
int go[][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y)
{
for(int k=0;k<4;k++)
{
int xx=x+go[k][0];
int yy=y+go[k][1];
if(xx>=n||xx<0||yy>=m||yy<0||vis[xx][yy]==1||mp[xx][yy]=='#')
continue;
vis[xx][yy]=1;
ans++;
dfs(xx,yy);
}
}
int main()
{
while(scanf("%d%d",&m,&n)==2&&n&&m)
{
memset(vis,0,sizeof(vis));
ans=0;
getchar();
for(int i=0;ifor(int j=0;jscanf("%c",&mp[i][j]);
getchar();
}
int flat=0;
for(int i=0;ifor(int j=0;jif(mp[i][j]=='@')
{
ans++;
vis[i][j]=1;
dfs(i,j);
flat=1;
break;
}
}if(flat)
break;
}
printf("%d\n",ans);
}
return 0;
}
ac2:
#include
#include
#include
using namespace std;
int mp[25][25],vis[25][25],ans,n,m;
int go[][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y)
{
if(x<0||x>=n||y<0||y>=m||vis[x][y]==1||mp[x][y]=='#')
return;
ans++;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+go[i][0];
int yy=y+go[i][1];
dfs(xx,yy);
}
}
int main()
{
while(scanf("%d%d",&m,&n)==2&&n&&m)
{
memset(vis,0,sizeof(vis));
ans=0;
getchar();
for(int i=0;i
for(int j=0;j
getchar();
}
int flat=0;
for(int i=0;i
for(int j=0;j
if(mp[i][j]=='@')
{
dfs(i,j);
flat=1;
break;
}
}if(flat)
break;
}
printf("%d\n",ans);
}
return 0;
}