题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象为墙,然后.为可以走的空地,求人可以走的最大点数。 解题思路: 好吧,搜索入门题,直接广度搜索,标志入队的次数。入队的次数即为行走的步数。 代码:
#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<
posted on 2011-12-06 00:48  cchun  阅读(597)  评论(0编辑  收藏  举报