迷宫问题II
Time Limit: 1000 MS Memory Limit: 32768 KB
64-bit integer IO format: %lld , %llu Java class name: Main
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;
}