6.Hero In Maze

Hero In Maze
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 1565   Submission Accepted: 241
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
Original Transformed
4 4 10
....
....
....
S**P
0 0 0

Sample Output
Original Transformed
YES

DFS会超时,所以用BFS,BFS算法如下

#include<stdio.h>
#include<string.h>
char maze[50][50];
int book[50][50];
struct node
{
    int x;
    int y;
    int s;
};
int main()
{
    int m,n,t;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        struct node queue[2500];
        memset(book,0,sizeof(book));
        int xs,ys,xe,ye;
        if(m==0&&n==0&&t==0)return 0;
        for (int i = 1;i <= m;i++)
        {
            getchar();
            for (int j = 1;j <= n;j++)
            {
                scanf("%c",&maze[i][j]);
                if (maze[i][j] == 'S')
                {
                    xs = i;ys = j;
                }
                if (maze[i][j] == 'P')
                {
                    xe = i;ye = j;
                }
            }
        }
        int flag=0;
        int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        int head=1,tail=1;
        queue[tail].x=xs;
        queue[tail].y=ys;
        queue[tail].s=0;
        tail++;
        book[xs][ys]=1;
        while(head<tail)
        {
            int tx,ty;
            for(int k=0;k<4;k++)
            {
                tx=queue[head].x+next[k][0];
                ty=queue[head].y+next[k][1];
                if(tx<1||tx>m||ty<1||ty>n)
                    continue;
                if((maze[tx][ty]=='.'||maze[tx][ty]=='P')&&book[tx][ty]==0)
                { 
                    book[tx][ty]=1;
                    queue[tail].x=tx;
                    queue[tail].y=ty;
                    queue[tail].s=queue[head].s+1;
                    tail++;
                }
                if(tx==xe&&ty==ye)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                break;
            head++;
        }
        if(queue[tail-1].s<=t&&flag==1)
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值