现在的位置: 首页 > 综合 > 正文

2534: The Hero Rescued The Princess

2013年01月21日 ⁄ 综合 ⁄ 共 2964字 ⁄ 字号 评论关闭
文章目录

2534: The Hero Rescued The Princess


Result TIME Limit MEMORY Limit Run Times AC Times JUDGE
3s 65536K 210 61 Standard

美丽的公主被关在古老的施了咒语的城堡中,你作为当今世上最勇敢的英雄,决定救出这位美丽的公主。
如果你成功了,最后公主就会嫁给你。当然故事有点俗套,至少如果你把她救出了,我会免费送你一个气球。
但是有很多的英雄去救,如果别人在你之前把公主救了,那么公主可就不属于你了。所以你一定要加快行动,现在就向目标进发吧。
这个城堡的地图由一个(15*30)的字符矩阵构成,我们可以保证矩阵是封闭的。
城堡中有很多的小怪,当然这对于武功高强你的一定不成问题,但你你需要比平时多用一天的时间。
字符有:
'#',表示城堡的墙,你不可以穿过;
'.',表示空地,你需要花费一天的时间走过。
'M',表示此地有怪,你需要两天的时间走过。
'S',表示你的初始地点
'T',表示公主的所在地
首行会有一个整数n(n<=10),表示后面有多少个迷宫,每个城堡由(15*30) 的矩阵构成,
每个城堡有且仅有一个S和T,现在你需要设计合适的路线保证总是尽量早的到公主的地方。
如果没有路线可以救出公主,输出-1;
你只能向上,向下,向左或向右走,但不可以斜着走。

Sample input

1
##############################
#.S#.........................#
#..#.........................#
#...MT.......................#
#.#..........................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
##############################

Sample output

6

 

Problem Source: Keenas

 

 

#include<stdio.h>
#include<string.h>
int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
char map[20][40];
struct node
{
    int x,y,l;
}a[1000];
int f[20][40];
int bfs(int x,int y)
{
    int i,j,top=0;
    a[top].x=x,a[top].y=y;
    a[top++].l=0;
    for(i=0;i<top;i++)
    {
  if(map[a[i].x][a[i].y]=='M')
  {
   a[top].x=a[i].x,a[top].y=a[i].y,a[top++].l=a[i].l+1;map[a[i].x][a[i].y]='.';continue;
  }
        for(j=0;j<4;j++)
        {
            int tx=a[i].x+xx[j];
            int ty=a[i].y+yy[j];
            if(f[tx][ty]==0)
            {
                a[top].x=tx;a[top].y=ty;
                a[top].l=a[i].l+1;
                if(map[tx][ty]=='T') return a[top].l;
                f[tx][ty]=1;
                top++;
            }
        }
    }
    return -2;
}
int main()
{
 int i,j,n;
 scanf("%d",&n);
 while(n--)
 {
  for(i=0;i<15;i++)
   scanf("%s",map[i]);
  int t,p,q;
  memset(f,0,sizeof(f));
  for(i=0;i<15;i++) for(j=0;j<50;j++)
  {
      if(map[i][j]=='#') f[i][j]=1;
      if(map[i][j]=='S') p=i,q=j;
  }
  t=bfs(p,q);
  if(t!=-2)
  {
   printf("%d/n",t);
  }
  else
   printf("-1/n");
 }
 return 0;
}
/*
2
##############################
#.SM.........................#
#.#M.#.......................#
#..#M.#......................#
#.#..#.......................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#...........................M#
#...........................T#
##############################

##############################
#.S..........................#
#.##.#.......................#
#...M.#......................#
#.#..#.......................#
#............M...............#
#...........M................#
#.........MM..T..............#
#...........M.M..............#
#............................#
#............................#
#............................#
#............................#
#............................#
##############################

*/

抱歉!评论已关闭.