题目大意:         有一只小狗要去找另一只小狗,两只小狗的坐标都知道,然后这个地图里只有两种元素,即房子还有草地,如果小狗经过房子,则不用花时间,如果经过的是草地,时间+1,最后算出小狗到达目标的时候所花费的最小时间。 解题思路:         用优先队列解决这道题目,还是比较好理解的。每次都从队列里面取出当前到达时间最小的一个点,然后由这个点进行扩展,到达目标。好像还可以用一般的队列做,但是一想起来就有点疼,感觉复杂了许多,要考虑把相邻的X都先入队吧。稍后再想想用一般队列做。 代码:
#include
#include
const int MAX=1005;
using namespace std;
char map[MAX][MAX];

typedef struct s
{
	int x,y;
	int step;
	s(int a=0): step(a){};
	const bool operator < (const struct s &s1 ) const
	{
		return step>s1.step;
	}
}S;
int visited[MAX][MAX];
int n,m;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int bfs(int sx,int sy,int ex,int ey)
{
	priority_queue Q;
	S pre,cur;
	pre.x=sx;
	pre.y=sy;
	pre.step=0;
	Q.push(pre);
	visited[pre.x][pre.y]=1;
	while(!Q.empty())
	{
		pre=Q.top();
		Q.pop();
		cur=pre;
		for(int i=0;i<4;i++)
		{
			cur.x=pre.x+dir[i][0];
			cur.y=pre.y+dir[i][1];
			cur.step=pre.step;
			if(cur.x>=1&& cur.x<=m && cur.y>=1 && cur.y<=n 
				&& visited[cur.x][cur.y]==0)
			{
				if(map[cur.x][cur.y]=='.')
					cur.step=pre.step+1;
				if(cur.x==ex && cur.y==ey)
					return cur.step;
				Q.push(cur);
				visited[cur.x][cur.y]=1;
			}
		}
	}
	return -1;
}
void init()
{
	memset(visited,0,sizeof(visited));//注意初始化
}
int main(void)
{
	while(scanf("%d%d",&m,&n),n||m)//这里用cin果断超过1000ms,用scanf512ms飘过~还有,注意m是row,n是col
	{
		init();
		int sx,sy,ex,ey;
		for(int i=1;i<=m;i++)
			scanf("%s",map[i]+1);
		scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
		int ans=bfs(sx,sy,ex,ey);
		printf("%d\n",ans);
	}
	return 0;
}
posted on 2011-11-30 22:19  cchun  阅读(252)  评论(0编辑  收藏  举报