HRBUST 1621 迷宫问题II

迷宫问题II

Time Limit: 1000 MS Memory Limit: 32768 KB

64-bit integer IO format: %lld , %llu Java class name: Main

[Submit] [Status] [Discuss]

Description

小z身处在一个迷宫中,小z每分钟可以走到上下左右四个方向的相邻格之一。迷宫中有一些墙和障碍物。

同时迷宫中也有一些怪兽,当小z碰到任意一个怪兽时,小z需要将怪兽消灭掉才可以离开此方格。但消灭

怪兽会花费一定的时间。现在小z想知道走出迷宫需要花费的最少时间。

Input


输入第一行为组数T(T<=10)。

对于每组数据第一行为两个整数R和C(1<=R,C<=200)。以下R行每行有C个字符,即迷宫地图。

其中”#”代表墙和障碍物,”.”表示空地,[1~9]的数字代表此处有怪兽以及消灭此处的怪兽需要的时间.

“Z”表示小z的起始位置,”W”表示迷宫出口。

对于每组数据保证起始位置和迷宫出口唯一。

Output

对于每组数据,输出走出迷宫的最短时间(单位:分钟)。如果无法走出迷宫则输出”IMPOSSIBLE”。

Sample Input

2
3 4
.Z..
.234
#.W.
4 4
Z.1.
.32.
##4.
W#..

Sample Output

5
IMPOSSIBLE

嗯……广搜+优先队列。

优先队列没有完全理解是死背的,所以背到一半就有点缺三少四了,WA了好多次最后才写出来= =

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char map[250][250];
int w,h,z_x,z_y,w_x,w_y;
int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct st
{
	int x,y,step;
	bool friend operator<(st a,st b)
	{
		return a.step>b.step;
	}
}z,temp;
int Well(st a)
{
	if(map[a.x][a.y]!='#'&&a.x>=0&&a.x<w&&a.y>=0&&a.y<h)
		return 1;
	else
		return 0;
}
int bfs()
{
	z.x=z_x;z.y=z_y;z.step=0;
	priority_queue<st>q;
	int i,n;
	q.push(z);
	while(!q.empty())
	{
		z=q.top();
		q.pop();
		if(z.x==w_x&&z.y==w_y)
			return z.step;
		for(i=0;i<4;i++)
		{
			temp.x=z.x+dis[i][0];
			temp.y=z.y+dis[i][1];
			if(Well(temp))
			{
				if(map[temp.x][temp.y]=='W'||map[temp.x][temp.y]=='.')
					temp.step=z.step+1;
				else
				{
					n=map[temp.x][temp.y]-'0';
					temp.step=z.step+n+1;
				}
				map[temp.x][temp.y]='#';
				q.push(temp);
			 } 
		}
	}
	return -1;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&w,&h);
		int i,j;
		for(i=0;i<w;i++)
		{
			scanf("%s",map[i]);
			for(j=0;j<h;j++)
			{
				if(map[i][j]=='Z')
				{
					z_x=i;z_y=j;
				}
				if(map[i][j]=='W')
				{
					w_x=i;w_y=j;
				}
			}
		}
		int sum=bfs();
		if(sum==-1)
			printf("IMPOSSIBLE\n");
		else
		{
			printf("%d\n",sum);
		}
	}
	return 0;
}

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/A_ice_/article/details/50525801
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞