总时间限制: 1000ms 内存限制: 65536kB

题目

佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?

已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?

输入

输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。

输出

输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。

样例输入

样例输入1
4 4 1
#@##
**##
###+
**** 样例输入2
4 4 2
#@##
**##
###+
****

样例输出

样例输出1
6 样例输出2
4

解析

这道题要用广搜算法,我们先来看一下广搜(广度优先搜索)的模板(伪代码):

#include<bits/stdc++.h>
using namespace std;
结构体数组(struct)
int main()
{
定义变量
输入、寻找起点并给初值
如果可以扩展
{
指向待扩展节点
for循环计算新节点数据
{
计算新节点数据
如果数据满足条件
{
扩展节点
如找到终点
{
输出数据
return 0;
}
}
}
}
}

以下代码段是7084:迷宫问题的解法OpenJudge - 7084:迷宫问题

#include<bits/stdc++.h>
using namespace std;
struct aa
{
int x,y,f;
}q[123];
int main()
{
int i,k=0,j,tx,ty,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},head=0,tail=1,a[5][5],v[5][5]={0},answer[30][3];
for(i=0;i<=4;i++)
for(j=0;j<=4;j++)
cin>>a[i][j];
q[1].x=0;
q[1].y=0;
q[1].f=0;
v[0][0]=1;
head=0;
tail=1;
while(head<tail)
{
head++;
for(i=0;i<4;i++)
{
tx=dx[i]+q[head].x;
ty=dy[i]+q[head].y;
if(tx>=0&&ty>=0&&tx<=4&&ty<=4&&a[tx][ty]!=1&&v[tx][ty]==0)
{
tail++;
q[tail].x=tx;
q[tail].y=ty;
q[tail].f=head;
v[tx][ty]=1;
if(tx==4&&ty==4)
{
while(tail!=0)
{
k++;
answer[k][1]=q[tail].x;
answer[k][2]=q[tail].y;
tail=q[tail].f;
}
for(j=k;j!=0;j--)
{
printf("(%d, %d)",answer[j][1],answer[j][2]);
cout<<endl;
}
return 0;
}
}
}
}
}

这道题其他都好办(学过c++算法2年以上的100%会做),只需修改以上程序,但如何修改就成了问题

如何使用‘查克拉’、如何统计‘查克拉’数量呢?

首先,在结构体数组q中添加结构体成员‘cha’,也就是‘查克拉’。

struct aa
{
int x,y,cha,step;
}q[40005]; //q:队列数组

接下来,更改入队时的的“入队仪式”

q[1].x=i;//起点入队
q[1].y=k;
q[1].cha=t;
q[1].step=0;
v[i][k][t]=1;//v:状态数组
tail++;//新节点入队
q[tail].x=tx;
q[tail].y=ty;
q[tail].cha=cha;
q[tail].step=q[head].step+1;
v[tx][ty][cha]=1;

也许大家注意到了,该程序中的状数组‘v’是3维数组,因为‘查克拉’数量会影响‘路况’

完整代码

#include<bits/stdc++.h>
using namespace std;
struct aa
{
int x,y,chuclut,step;
}q[40005]; //q:队列数组
int main()
{
int r,c,i,k,t,chuclut,tx,ty,dx[4]={0,0,-1,1},dy[4]={-1,1,0,0},v[205][205][10]={0},head,tail;
char a[205][205];
cin>>r>>c>>t;//r,c:迷宫大小;
for(i=1;i<=r;i++)//循环输入
for(k=1;k<=c;k++)
{
cin>>a[i][k];//a:迷宫存放数组
if(a[i][k]=='@')//如果找到起点
{
q[1].x=i;//起点入队
q[1].y=k;
q[1].chuclut=t;
q[1].step=0;
v[i][k][t]=1;//v:状态数组
}
}
head=0,tail=1;//初始化q数组下标
while(head<tail)//head,tail:q数组下标变量
{
head++;//指向待扩展节点
for(i=0;i<4;i++)
{
tx=q[head].x+dx[i];//计算新坐标位置
ty=q[head].y+dy[i];//dx,dy,tx,ty:新节点坐标计算变量;
if(a[tx][ty]=='#')//如果新节点需要查克拉
chuclut=q[head].chuclut-1;//计算新节点查克拉数量
else//如果不用查克拉
chuclut=q[head].chuclut;//计算新节点查克拉数量
if(tx>=1&&ty>=1&&tx<=r&&ty<=c&&v[tx][ty][chuclut]==0&&chuclut>=0)//如果新节点符合入队标准
{
tail++;//新节点入队
q[tail].x=tx;
q[tail].y=ty;
q[tail].chuclut=chuclut;
q[tail].step=q[head].step+1;
v[tx][ty][chuclut]=1;
if(a[tx][ty]=='+')//如果找到终点
{
cout<<q[tail].step;//输出步数
return 0;
}
}
}
}
cout<<-1;//如果未找到终点,输出-1
}

NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解的更多相关文章

  1. [NOI OJ]6044:鸣人和佐助

    6044:鸣人和佐助 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示) ...

  2. [openjudge-搜索]广度优先搜索之鸣人和佐助

    题目描述 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸 ...

  3. #搜索# #BFS# #优先队列# ----- OpenJudge鸣人和佐助

    OpenJudge 6044:鸣人和佐助 总时间限制: 1000ms  内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐 ...

  4. noi openjudge 6044:鸣人和佐助

    http://noi.openjudge.cn/ch0205/6044/ 描述佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个 ...

  5. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  6. 二分算法题目训练(三)——Anton and Making Potions详解

    codeforces734C——Anton and Making Potions详解 Anton and Making Potions 题目描述(google翻译) 安东正在玩一个非常有趣的电脑游戏, ...

  7. SIFT算法详解(转)

    http://blog.csdn.net/zddblog/article/details/7521424 目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature ...

  8. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  9. Java虚拟机详解04----GC算法和种类【重要】

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 北航内核操作系统-lab0

    1.lab0环境介绍. 2.进入实验界面. 3.进入实战测试. 任务要求: 3.1编写斐波那契数列. 3.2编写Makefile脚本. Makefile介绍: make命令执行时,需要一个 Makef ...

  2. selenium模块 phantomJs 谷歌无可视界面

    参考微博: 什么是selenium 一款基于浏览器自动化的模块 什么是浏览器自动化 通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中 ...

  3. 干掉RedisHelper,请这样用分布式缓存

    前言 我们在项目中使用Redis时通常是写一个单例模式的RedisHelper静态类,暴露一些常用的Get.Set等操作,在需要使用地方直接RedisHelper.StringGet(xx,xx)就可 ...

  4. 好客租房40-react组件基础综合案例-案例需求分析

    实现 案例的数据 渲染评论列表 有评论 没有评论 暂无评论 获取评论信息 包括评论人和受控组件 发表评论 更新评论 //导入react import React from 'react' import ...

  5. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  6. springBoot 定时+发送邮件

    定时任务引入meaven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  7. 记一次生产事故的排查与优化——Java服务假死

    一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...

  8. [第18届 科大讯飞杯 J] 能到达吗

    能到达吗 题目链接:牛客5278 J 能到达吗 Description 给定一个 \(n\times m\) 的地图,地图的左上角为 \((1, 1)\) ,右下角为 \((n,m)\). 地图上有 ...

  9. 工具分享:清理 Markdown 中没有引用的图片

    前言: 之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯.但是一是由于 notion 的服务器在国外,有时候很不稳定:二是由于 notion 的分享很不方便,把笔记分享给别人点开链接之 ...

  10. 【Java面试】Kafka 怎么避免重复消费

    Hi,大家好,我是Mic 一个工作5年的粉丝找到我. 他说: "Mic老师,你要是能回答出这个问题,我就佩服你" 我当场就懵了,现在打赌都这么随意了吗? 我问他问题是什么,他说&q ...