gdufe1538-是男人就上100层-(三维bfs)

Problem Description:

桐老爷和UGO终于来到了名为“是男人就上一百层的塔”的下面,听说大祭司在第100层沉睡。为了题目需要,我把这个塔的层数随机打乱,层数的话大家就忘了前面的100吧,用n*m的一个矩阵来代替。前面提到大祭司在沉睡,所以桐人和尤吉欧希望赶快到达大祭司面前杠正面,但是有些层有整合骑士看守。只有在桐人或者UGO有“Enhance armament”(武装支配术)才可以打败,否则无法从这里通过。他们只可以从当前位置上下左右移动,不能斜着走。从一层走到另一层耗费1个时间单位,打败整合骑士不耗时间但是会消耗一个武装支配术。问:他们最快多久可以到达大祭司面前。

Input:

输入的第一行包含三个整数:M,N,T。M,N代表M行N列的地图,T代表桐人与尤吉欧武装支配术之和。0 < M,N < 200,0 ≤ T < 10  注:“Enhance armament”无法回复。后面是M行N列的地图,其中@代表桐人和尤吉欧,+代表大祭司。*代表可以直接通过的层,#代表有整合骑士的层。

Output:

输出包含一个整数R,代表桐人和尤吉欧来到大祭司面前最少需要花费的时间。如果桐尤无法追来到大祭司面前,则输出-1。

Sample Input:

4 4 1
#@##
**##
###+
****
4 4 2
#@##
**##
###+
****

Sample Output:

6
4
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<stack>
#include<set>
#include<queue>
#include<cstring>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;

struct node
{
    int x;
    int y;
    int time;///时间
    int t;///技能
};

node start,end;
int d[4][2]={ -1,0, 1,0, 0,-1, 0,1   };///上下左右
char a[205][205];
bool vis[205][205][12];

queue<node>que;
int n,m,t,ans;

void bfs()
{
    memset(vis,false,sizeof(vis));
    while(!que.empty()) que.pop();
    vis[start.x][start.y][start.t]=true;
    que.push(start);
    while(!que.empty())
    {
        node now=que.front();
        que.pop();
        if(a[now.x][now.y]==‘+‘)///遇到boss
        {
            ans=now.time;
            break;
        }
        for(int i=0;i<4;i++)
        {
            int xx=now.x+d[i][0];
            int yy=now.y+d[i][1];
            int time=now.time+1;///无论有没有怪,时间都要加1
            if(xx>=0 && xx<n && yy>=0 && yy<m)///不越界的地方里
            {
                if( (a[xx][yy]==‘*‘ || a[xx][yy]==‘+‘)&& !vis[xx][yy][now.t])///没有怪,大祭司也要加进去
                {
                    vis[xx][yy][now.t]=true;
                    que.push( {xx,yy,time,now.t} );///技能数不变
                }
                if(a[xx][yy]==‘#‘ && now.t>0 && !vis[xx][yy][now.t-1] )///有怪,技能数要>1
                {
                    vis[xx][yy][now.t-1]=true;
                    que.push( {xx,yy,time,now.t-1});///压入队列技能数要-1
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        ans=-1;
        for(int i=0;i<n;i++)
        {
            scanf("%s",a[i]);
        }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            if(a[i][j]==‘@‘)
            {
                start.x=i;
                start.y=j;
                start.time=0;
                start.t=t;
            }
        }
        bfs();
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shoulinniao/p/10467869.html

时间: 2024-11-09 23:54:52

gdufe1538-是男人就上100层-(三维bfs)的相关文章

是男人就下100层【第四层】——Crazy贪吃蛇(2)

在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇可以绕着手机屏幕边线移动并且可以改变方向 一.添加状态并修改代码 首先我们来用另外一种方式实现上一版本中的刷新界面,在Crazy贪吃蛇(1)中我们自定义了一个线程每隔1s钟刷新界面,在线程中我们使用了postInvalidate()方法通知主线程重绘界面,我们打开View的源代码看看到底是如何通知主线程的,原代码如下: public void postInvalidate(int

是男人就下100层【第五层】——2048游戏

前言: 在"阳光小强"的实战系列博文<是男人就下100层>的上一层我们一起从零开始完成了我们自己的贪吃蛇游戏--CrazySnake,可能很多朋友还不过瘾,那么我们今天就来玩一玩最近一直比较火的2048游戏,让大家再过一把瘾.由于"阳光小强"目前并没有从事Android的游戏开发工作,所以这些游戏的实现并不需要很专业的游戏开发知识,如果你有Android的基础就可以一起来参与进来共同完成这个游戏.有些朋友可能就会说"这些小游戏,会不会有点简单,

是男人就下100层【第五层】——2048游戏从源码到发布市场

上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的所有源代码公开并结合这个实例在这篇文章中介绍一下如何添加广告和实现分享功能. 最终运行效果如下(更多运行效果请看<是男人就下100层[第五层]--换肤版2048游戏>): 一.如何实现换肤 换肤的思路其实很简单,在ActionBar中添加菜单,当用户选择某一个皮肤后就将当前的皮肤状态修改并保存到SharedPreference中,

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 <canvas> 元素. 贴士:全部例子都分享在我的 GayHub - https://github.com/bxm0927/canvas-special 尤雨溪个人主页炫彩三角纽带效果,点击还可变换 GitHub源码 . Demo演示 知乎登录注册页动态离子背景效果 GitHub源码 . Demo演

【编程马拉松】【026-是男人就下100层】

[编程马拉松算法目录] [026-是男人就下100层][工程下载>>>] 1 题目描述 相信大家都听说过"是男人就下100层"系列游戏,游戏中包括多个长度和高度各不相同的平台,地面是最低的平台,高度为零,长度无限. 一个男人在开始的时候从高于所有平台的某处开始下落,它的下落速度始终为1米/秒.当他落到某个平台上时,游戏者选择让他向左或向右跑,跑动的速度也是1米/秒.当他跑到平台的边缘时会继续下落.要求每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束. 请帮忙

是男人就下100层【第四层】——Crazy贪吃蛇(1)

贪吃蛇是一款很经典的游戏,这些经典游戏给我们的童年增加了不少乐趣,今天开始我们来一步一步的在Android设备上实现一款贪吃蛇游戏,我也是第一次写这个游戏,有可能会写错,或者走弯路,但是最终希望能有一个好的结果,接下来我们一起来一步步的摸着石头开发吧. 一.建立一个工程 二.自定义View(贪吃蛇界面) package com.example.crazysnake; import android.content.Context; import android.graphics.Canvas; i

是男人就下100层【第四层】——Crazy贪吃蛇(3)

上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(2)>实现了贪吃蛇绕着屏幕四周移动,这一篇我们来完成贪吃蛇的所有功能. 一.随机产生苹果 private void addAppleBox(){ int randomX = random.nextInt(xMaxBoxCount); int randomY = random.nextInt(yMaxBoxCount); for(int i=0; i<boxs.size(); i++){ if(boxs.get(i).getX()

HTML5游戏开发_是男人就下100层

项目流程 市场调研(可行性分析)--> 可行性报告书  需求分析师.客户经理 需求分析--> 需求说明书  项目经理.需求分析师 概要设计--> 概要设计说明书(ER图, UML)  项目经理.项目组长 详细设计--> 详细设计说明书(流程图) 数据库建好.项目周期表(甘特图) office project visio 项目组长.开发人员 编码 --> 测试(单元测试) 提交svn 测试用例  开发人员 测试 --> 集成测试.黑白盒测试.冒烟测试  测试人员 --&g

是男人就下100层【第六层】——高仿豆瓣客户端

前一段时间阳光小强安装了一个豆瓣客户端,第一次打开就被这种界面风格吸引了,今天早上起来在打开豆瓣听音乐的时候,突然产生一个念头,来试着实现一下这种效果,打开客户端分析了一下发现其实这种效果的实现并不是想象中的那么难,下面我先分析一下这种效果的实现思路,然后一步步解释实现的过程,希望大家能提出意见和建议,一起交流学习. 先给大家展示一下我的成果吧: 其实豆瓣客户端的界面上还有其他的文字和菜单,但是这两个的实现效果和其他几个类似,可以作为代表,所以就不绘制那么多组件了. 转载请说明出处:http:/