YTU 1006 Hero In Maze

本文探讨了一位英雄在500年前为拯救被困公主于迷宫中的冒险故事。通过输入迷宫地图和剩余时间,读者可以判断英雄是否有可能在限定时间内找到并救援公主。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1006: Hero In Maze

Time Limit: 1000 Sec   Memory Limit:64 MB
Submit: 59   Solved: 16
[ Submit][ Status][ Web Board]

Description

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。 时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T 500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。

Input

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

Output

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

Sample Input

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

Sample Output

YES

HINT

报告参见http://acm.zjgsu.edu.cn/Report/1005/1005.html

Source


没弄清楚行和列wa一早上debug半天才发现。。。。。。。。。。

ACcode:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct my{
    int x,y;
    int cns;
}me[10005];
int ed,dx,dy,n,m,t,used;
char map[50][50];
int tu[4][2]={1,0,0,1,-1,0,0,-1};
bool flag;
bool check(my a){
    if(a.x>0&&a.x<=n&&a.y>0&&a.y<=m&&map[a.x][a.y]!='*')
        return true;
    return false;
}
void bfs(my stt){
    my now,next;
    stt.cns=0;
    used=ed=0;
    me[ed++]=stt;
    map[stt.x][stt.y]='*';
    while(used<ed){
        now=me[used++];
        for(int i=0;i<4;++i){
            next.x=now.x+tu[i][0];
            next.y=now.y+tu[i][1];
            next.cns=now.cns+1;
            if(check(next)){
                if(map[next.x][next.y]=='P'&&next.cns<=t){
                    flag=true;
                    return;
                }
                map[next.x][next.y]='*';
                me[ed++]=next;
            }
        }
    }
    return;
}
int main(){
   while(scanf("%d %d %d",&m,&n,&t)!=EOF&&(n&&m&&t)){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;++j){
                cin>>map[i][j];
                if(map[i][j]=='S'){
                    dx=i;
                    dy=j;
                }
            }
        }
        flag=false;
        my temp;
        temp.x=dx;
        temp.y=dy;
        bfs(temp);
        printf(flag?"YES\n":"NO\n");
   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值