2534: The Hero Rescued The Princess
Result TIME Limit MEMORY Limit Run Times AC Times JUDGE
3s 65536K 276 83 Standard
美丽的公主被关在古老的施了咒语的城堡中,你作为当今世上最勇敢的英雄,决定救出这位美丽的公主。
如果你成功了,最后公主就会嫁给你。当然故事有点俗套,至少如果你把她救出了,我会免费送你一个气球。
但是有很多的英雄去救,如果别人在你之前把公主救了,那么公主可就不属于你了。所以你一定要加快行动,现在就向目标进发吧。
这个城堡的地图由一个(15*30)的字符矩阵构成,我们可以保证矩阵是封闭的。
城堡中有很多的小怪,当然这对于武功高强你的一定不成问题,但你你需要比平时多用一天的时间。
字符有:
'#',表示城堡的墙,你不可以穿过;
'.',表示空地,你需要花费一天的时间走过。
'M',表示此地有怪,你需要两天的时间走过。
'S',表示你的初始地点
'T',表示公主的所在地
首行会有一个整数n(n<=10),表示后面有多少个迷宫,每个城堡由(15*30) 的矩阵构成,
每个城堡有且仅有一个S和T,现在你需要设计合适的路线保证总是尽量早的到公主的地方。
如果没有路线可以救出公主,输出-1;
你只能向上,向下,向左或向右走,但不可以斜着走。
Sample input
1
##############################
#.S#...........................................................#
#..#.............................................................#
#...MT.........................................................#
#.#.............................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
#................................................................#
##############################
Sample output
6
这是我第一次用优先队列做题,优先队列与一般的队列没有太大的差距,主要是在申请队列跟取数值的时候有些出入。。
#include<cstdio>#include<cstring>
#include<queue>
#include<vector>
using namespace std;
class node
{
public:
node(int i=0,int j=0,int d=0):
x(i),y(j),day(d){}
int x,y;
int day;
};
class cmp
{
public:
bool operator ()(const node &n1,const node&n2)
{
return n1.day>n2.day;/*这个地方我刚开始不是很理解在这里我重点强调一下,
优先队列是用堆进行排序的用子节点与父节点进行比较。
如果子节点小于父节点就要互换从而保证最顶端的是数值最小的
而且是优先级最高的。。。。*/
}
};
char map[20][40];
int visited[20][40];
int bfs(int i,int j)
{
int min=100000000;
node temp(i,j);
priority_queue<node,vector<node>,cmp>q;
q.push(temp);
visited[i][j]=1;
while(!q.empty())
{
temp=q.top();
q.pop();
if(map[temp.x][temp.y]=='T')
{
min=min<temp.day?min:temp.day;
}
else
{
int x=temp.x;
int y=temp.y;
//down
if(x+1<=15&&!visited[x+1][y]&&map[x+1][y]!='#')
{
if(map[x+1][y]=='M')
{
temp.day+=2;
temp.x++;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=2;
temp.x--;
}
else
{
temp.day++;
temp.x++;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day--;
temp.x--;
}
}
//up
if(x-1>0&&!visited[x-1][y]&&map[x-1][y]!='#')
{
if(map[x-1][y]=='M')
{
temp.day+=2;
temp.x--;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=2;
temp.x++;
}
else
{
temp.day+=1;
temp.x--;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=1;
temp.x++;
}
}
//left
if(y-1>0&&!visited[x][y-1]&&map[x][y-1]!='#')
{
if(map[x][y-1]=='M')
{
temp.day+=2;
temp.y--;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=2;
temp.y++;
}
else
{
temp.day+=1;
temp.y--;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=1;
temp.y++;
}
}
//right
if(y+1<=30&&!visited[x][y+1]&&map[x][y+1]!='#')
{
if(map[x][y+1]=='M')
{
temp.day+=2;
temp.y++;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=2;
temp.y--;
}
else
{
temp.day+=1;
temp.y++;
q.push(temp);
if(map[temp.x][temp.y]!='T');
visited[temp.x][temp.y]=1;
temp.day-=1;
temp.y--;
}
}
}
}
return min;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int n;
int startx,starty;
scanf("%d",&n);
getchar();
for(int s=1;s<=n;s++)
{
memset(visited,0,sizeof(visited));
for(int i=1;i<=15;i++)
{
for(int j=1;j<=30;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')
{
startx=i;
starty=j;
}
}
getchar();
}
int min=bfs(startx,starty);
if(min!=100000000)printf("%d\n",min);
else printf("-1\n");
}
return 0;
}