题目大意:
一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象为墙,然后.为可以走的空地,求人可以走的最大点数。
解题思路:
好吧,搜索入门题,直接广度搜索,标志入队的次数。入队的次数即为行走的步数。
代码:
#include
#include
const int MAX=25;
using namespace std;
typedef struct node
{
int x,y;
int step;
}N;
int c,r;
bool visited[MAX][MAX];
char map[MAX][MAX];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上,右,下,左
int step;
void init()
{
memset(visited,false,sizeof(visited));
step=0;
}
int BFS(int sx,int sy)
{
queue Q;
N pre,cur;
pre.x=sx;
pre.y=sy;
pre.step=1;
visited[pre.x][pre.y]=true;
Q.push(pre);
while(!Q.empty())
{
pre=Q.front();
Q.pop();
step++;
for(int i=0;i<4;i++)
{
cur=pre;
cur.x=pre.x+dir[i][0];
cur.y=pre.y+dir[i][1];
if(cur.x>=1 && cur.x<=r && cur.y>=1 && cur.y<=c
&& visited[cur.x][cur.y]==false && map[cur.x][cur.y]=='.')
{
visited[cur.x][cur.y]=true;
cur.step++;
Q.push(cur);
}
}
}
return step;
}
int main(void)
{
while(scanf("%d%d",&c,&r),r||c)
{
int sx,sy;
for(int i=1;i<=r;i++)
{
scanf("%s",map[i]+1);
for(int j=1;j<=c;j++)
{
if(map[i][j]=='@')
{
sx=i;
sy=j;
}
}
}
init();
int ans=BFS(sx,sy);
cout<