aoj 6 Hero In Maze

题目链接:http://ccpc.ahu.edu.cn:8000/OJ/Problem.aspx?id=6

题目描述:

 

Description

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。

突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。 
时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T 
500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。

他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。

 

Input

题目包括多组测试数据。 
每组测试数据以三个整数N,M,T(0 < N,M <= 20)开头,
分别代表迷宫的长和高,以及公主能坚持的天数。 
紧接着有M行,N列字符,由".","*","P","S"组成。其中 
"." 代表能够行走的空地。 
"*" 代表墙壁,Jesse不能从此通过。 
"P" 是公主所在的位置。 
"S" 是Jesse的起始位置。 
每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。 
输入以0 0 0结束。

 

Output

如果能在规定时间内救出公主输出“YES”,否则输出“NO”。

 

Sample Input

OriginalTransformed
4 4 10
....
....
....
S**P
0 0 0

 

Sample Output

OriginalTransformed
YES

 

 

 

 

题目分析:

bfs大法好!

 

AC代码:

 

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
int sx,sy,ex,ey;
int map[105][105]/*地图*/,distanc[105][105]/*记录点距离出发点的距离*/,n,m,time_limit,time_cost;
bool visit[105][105];//记录节点是否已经走过
char s[105];
int q[1005];//队列
int dx[]={1,-1,0,0};//x方向
int dy[]={0,0,1,-1};//y方向

#define LIM (nx>=0&&nx<m&&ny>=0&&ny<n)

int bfs(int x,int y)
{
   int front=0,rear=1;
   int u=x*n+y;
   q[front]=u;//入队
   visit[x][y]=1;
   distanc[x][y]=0;
   while(front<rear)
   {
   u=q[front++];
   x=u/n;
   y=u%n;
   for(int i=0;i<4;i++)
   {
       int nx=x+dx[i],ny=y+dy[i];
       if(LIM&&map[nx][ny]&&!visit[nx][ny])
           {
               int v=nx*n+ny;
               q[rear++]=v;
               visit[nx][ny]=1;
               distanc[nx][ny]=distanc[x][y]+1;
               if(nx==ex&&ny==ey)
                   return distanc[nx][ny];
           }
   }
   }
   return -1;
}

int main()
{
    while(1)
    {
        cin>>n>>m>>time_limit;
        if(m==0&&n==0&&time_limit==0)
            break;
        memset(map,0,sizeof(map));
        memset(visit,false,sizeof(visit));
        for(int i=0;i<m;i++)
        {
            cin>>s;
            for(int j=0;j<n;j++)
            {
                switch(s[j])
                {
                    case '.':map[i][j]=1;break;
                    case '*':map[i][j]=0;break;
                    case 'S':map[i][j]=1;sx=i;sy=j;break;
                    case 'P':map[i][j]=1;ex=i;ey=j;break;
                }
            }
        }
        time_cost=bfs(sx,sy);
        if(time_cost==-1||time_cost>time_limit)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值