TOJ 6119简单广搜

在一款编程竞赛题目中,勇者nzh需穿越多层迷宫营救被魔王囚禁的学姐。然而,这一切是情敌设下的陷阱,利用魔王之力消灭情敌。玩家需规划路径,引导勇者抵达顶层。

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

6119: 学长的阴谋
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 145 测试通过:24
描述

异世界穿越到现代华夏的魔王在面对科技发达的现代社会,完全迷失了人生的方向。为了不继续颓废下去而玷污了他魔王的名声,他决定干回本职工作——抓公主!当然,在现代华夏是不存在公主这个身份的,于是,魔王退而求其次,抓走了众人爱戴的学姐,随后利用魔王的力量创造了高耸的城堡,将学姐关在城堡的顶层。深爱着学姐的nzh得知学姐被抓走的事情后悲痛欲绝,他决心化身勇者,潜入魔王的栖身之所,只身一人救出学姐。

nzh通过现代技术探明了魔王所在的城堡并绘制了地图,城堡由下至上有许多层,每层都是一个迷宫,每层迷宫只有一个出口可以抵达上一层迷宫,而学姐就被关在最顶层的某处。不幸的是,nzh勇武有余而智谋不足,他不知道应该怎么走抵达最上层,现在,他请求同样深爱着学姐的你的帮助,你需要规划并且告诉nzh,他需要走怎样的路线才能解救学姐。

事实上,魔王抓走学姐正是你给魔王出的主意,你与初到现代的魔王做了一笔交易,你教会魔王现代知识并且帮助魔王占领世界,而魔王则帮助你除掉情敌nzh,并且帮你上演一出正义勇者战胜魔王拯救学姐的戏码。因此你安排魔王亲自守护在学姐的栖身之所,同时帮助nzh规划路线,让nzh能够顺利出现在魔王的面前,借魔王之手干掉他。

啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈咳咳呃。 ——某情敌

输入

第一行包含两个整数T,n。

T迷宫的层数。(T<=20)

n表示每层迷宫的大小,迷宫由一个n*n的区域组成。(2<=n<=100)

接下有T组nn的字符,第一组nn的字符表示第一层的迷宫,第二组表示第二层。

字符由’S’,‘P’,’#’,‘B’,’.'组成,其中

'S’表示每层迷宫的起点。

'P’表示每层迷宫的终点。

'B’表示最后一层魔王的位置。

'#'表示墙壁不可通过。

'.'表示通道可以通过。

最后一层迷宫只存在魔王’B’而不存在终点’P’。

一开始nzh处于城堡的第一层,且仅能走前后左右四个方向,不能斜着走。

输出

对于每组数据输出两行,第一行输出nzh最后可以抵达的迷宫的层数,第二行有两种情况,如果nzh无法达到学姐所在地,输出“sorry, my love!”,如果他成功抵达学姐所在地,则输出“oh, no!”。

样例输入

3 3
S…

…P
…P

S…

S.B

样例输出

3
oh, no!

题目来源

电信学院第二届新生程序设计竞赛

题解:新生赛的一道题,Bfs一下就好了

#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
int cnt,ex,ey,sx,sy,n,flag,f;
int dir[2][4]={-1,0,1,0,0,-1,0,1};	//方向
int a[110][110]; 	
int vis[110][110];
struct node{
    int x,y;
}now,next;
void bfs(int x,int y){
	++cnt;
    queue<node>q;
    memset(vis,0,sizeof(vis));
    vis[x][y]=1;
    now.x=x,now.y=y;
    q.push(now);
    while(!q.empty()){
        now=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=now.x+dir[0][i];
            int ny=now.y+dir[1][i];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&!vis[nx][ny]&&a[nx][ny]!='#'){
            	vis[nx][ny]=1;
            	if(a[nx][ny]=='B'){
	            	f=1;
	            	return ;
	            }
                if(a[nx][ny]=='P')
                    return ;
                next.x=nx,next.y=ny;
                q.push(next);
            }
        }
    }
    flag=0;
}
int main(){
    int t;
    scanf("%d%d",&t,&n);
    cnt=f=0,flag=1;
    for(int i=1;i<=t;i++){
        for(int j=1;j<=n;j++){
                getchar();
            for(int k=1;k<=n;k++){
                a[j][k]=getchar();
                if(a[j][k]=='S') sx=j,sy=k;
            }
        }
        if(flag)
        bfs(sx,sy);
    }
    printf("%d\n",cnt);
    if(f)
    printf("oh, no!\n");
	else
	printf("sorry, my love!\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值