给你一个二维数组,.表示可以到达,#表示障碍,@表示起始位置,问你能到达的最大地点有多少个,每次只能走上下左右
直接dfs,中间加了很多状态标记用来剪枝,但是发现没用上,直接也可以过,数据量小
#include <stdio.h>
#include <string.h>
#define N 21
int w,h,sx,sy;
char map[N][N];
bool used[N][N];
int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};
int dp[N][N];
int dfs(int x,int y)
{
int xx,yy,sum=0;
if(used[x][y])return 0;
if(dp[x][y]!=0)return dp[x][y];
used[x][y]=true;
for(int i=0;i<4;i++)
{
xx=x+dir[i][0];yy=y+dir[i][1];
if(!used[xx][yy]&&xx>=0&&xx<h&&yy>=0&&yy<w&&map[xx][yy]=='.')
{
sum+=dfs(xx,yy);
}
}
dp[x][y]=sum+1;;
return sum+1;
}
int main()
{
while(scanf("%d%d",&w,&h)!=EOF)
{
if(w==0&&h==0)break;
//getchar();
memset(used,false,sizeof(used));
memset(dp,0,sizeof(dp));
for(int i=0;i<h;i++)
scanf("%s",map[i]);
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
if(map[i][j]=='@')
{sx=i;sy=j;}
// getchar();
}
/*for(int i=0;i<h;i++)
{for(int j=0;j<w;j++)
printf("%c",map[i][j]);
printf("\n");}*/
printf("%d\n",dfs(sx,sy));
}
}