2534: The Hero Rescued The Princess

2534: The Hero Rescued The Princess


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE
3s65536K21061Standard

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

Sample input

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

Sample output

6

 

Problem Source: Keenas

 


This problem is used for contest: 124 

 

 

#include<stdio.h>
#include<string.h>
const int inf=32767;
int n;
bool flag ;
int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
char map[20][40];
int min;
int vis[50][50] ;
void dfs(int x,int y,int step)
{   
 int i;
 vis[x][y]=step;
 if(map[x][y]=='T')
 {
  if(step<min)
  {
   min=step;
   flag=true;
  }
  return ;
 }
 if(step>min) return ;
 for(i=0;i<4;i++)
 {
  if(map[x+xx[i]][y+yy[i]]=='#')
   continue;
     if(map[x+xx[i]][y+yy[i]]=='M')
                     { if(step+2<vis[x+xx[i]][y+yy[i]])
                                    dfs(x+xx[i],y+yy[i],step+2);}
  else
            { if(step+1<vis[x+xx[i]][y+yy[i]]) 
   dfs(x+xx[i],y+yy[i],step+1);}
 }
}

int main()
{
 int i,j;
 scanf("%d",&n);
 while(n--)
 {
        for(i=0;i<50;i++)
        {
                         for(j=0;j<50;j++)
                         {
                                          vis[i][j]=inf;
                          }
        }
                                        
  min=inf;
  for(i=0;i<15;i++)
   scanf("%s",map[i]);
  int ff=0;
  flag =false ;
  for(i=0;i<15;i++)
  {
   for(j=0;j<30;j++)
   {
    if(map[i][j]=='S')
    {
     dfs(i,j,0);
     ff=1;
     break;
    }
   }
   if(ff) break;
  }
  if(flag)
  {
   printf("%d/n",min);
  }
  else
   printf("-1/n");
  //int m;
  //scanf("%d",&m);
 }
 return 0;
}
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值