总时间限制: 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. XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  2. 组织:EFF

    电子前沿基金会(Electronic Frontier Foundation), 简称EFF,是一个非营利性的国际法律组织.该组织成立于1990年,创始人包括Mitch Kapor(Lotus公司的总 ...

  3. 干掉Switch-Case、If-Else----订阅发布模式+事件驱动模式

    在上位机和下位机或者服务端和客户端通信的时候,很多时候可能为了赶项目进度或者写代码方便直接使用Socket通信,传输string类型的关键字驱动对应的事件,这就有可能导致程序中存在大量的Switch- ...

  4. monit 配置详解(monitrc)

    monitrc是Monit的主配置文件(控制文件). monitrc的内容主要分为全局(golbal)和服务(services)两个部分. 默认情况下monitrc文件在/etc/monit目录下. ...

  5. CoaXPress 是如何只用一条线缆实现双向传输和供电的

    这是个很有意思的事情,CoaXPress的全双工双向数据传输.且供电只需要一条同轴线缆,这个原理对其它串行接口的设计是非常有参考价值的,尤其是对线缆长度.数量有严格要求的场合,一条同轴线缆走天下,不要 ...

  6. MVC - MVC的工作流程

    MVC 是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应 ...

  7. Navicat 连接 MySQL

    目录 简述 新建连接 常见错误 简述 Navicat 是一套快速.可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本.Navicat 图形界面直观,提供简便的管理方法,设计和操作 MyS ...

  8. VSCode 安装以及初步使用教程

    老样子先介绍一下VSCode(是什么?干什么?有什么用?好处是什么?等) VisualStudioCode(简称VSCode)是Microsoft开发的代码编辑器,它支持Windows,Linux和m ...

  9. 2020.10.17【普及组】模拟赛C组 总结

    总结 这次比赛 120 分,老师说上 200 是不容易的,但我觉得这不是我真的水平 改题情况 T1 题目大意:有 N 个小朋友,每个小朋友有 \(B_i\) 个朋友,问从中随机选 3 人使得 3 人关 ...

  10. Linux离线包管理器RPM

    Linux离线包管理器RPM RPM 是RedHat Package Manager(RedHat软件包管理工具). 1.rpm常用参数介绍 查看rpm是否安装 rpm -q rpm包名 [root@ ...