总时间限制: 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. iptables系列教程(三)| iptables 实战篇

    一个执着于技术的公众号 实战1 服务器禁止ping iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP // 禁止任何人ping通本机 &qu ...

  2. OpenStack计费服务

    cloudkitty服务介绍 当前版本cloudkitty可以完成虚拟机实例(compute),云硬盘(volume),镜像(image),网络进出流量(network.bw.in,network.b ...

  3. jQuery.extend()[$.extend()]

    jQuery.extend(target, object1[,objectN]);jQuery.extend([deep], target, object1[,objectN]);jQuery.ext ...

  4. Linux的快捷使用(不断更新中)

    Linux 命令行提示符 ~代表当前目录,即家目录,#是超级用户提示符,如果是普通用户使用$ 基本快捷键的使用 移动光标命令 Ctrl+A:移动光标到开头 Ctrl+E:移动光标到结尾 Ctrl+F: ...

  5. axios源码解析 - 请求拦截器

    axios请求拦截器,也就是在请求发送之前执行自定义的函数. axios源码版本 - ^0.27.2 (源码是精简版) 平时在业务中会这样去写请求拦截器,代码如下: // 创建一个新的实例 var s ...

  6. Linux下使用ssh测试端口是否开启

    当服务器上不允许使用telnet时,可以使用ssh测试远程服务器端口是否开启 具体命令如下 -v 显示连接debug信息 -p port 指定端口 ssh -v -p 80 root@192.168. ...

  7. maven install resources failed: newPosition < 0: (-1 < 0)

    添加以下代码在 pom.xml 中,具体参阅这里 <build> <plugins> <plugin> <groupId>org.apache.mave ...

  8. arts-week9

    Algorithm 521. Longest Uncommon Subsequence I - LeetCode Review 如何搭建一个私有的CDN? 大部分情况下,我们使用市场上现有的 CDN ...

  9. 行为参数化与lambda表达式 - 读《Java 8实战》

    零. 概述 第一部分:1~3章 主要讲了行为参数化和Lambda表达式 第二部分:4~7章 主要讲了流的应用,包括流与集合差异,流的操作,收集器,注的并行执行 第三部分:8~12章 主要讲了怎样用Ja ...

  10. 2022Gartner容器预测:2025年85%的企业将使用容器管理服务

    近日,国际知名权威分析机构Gartner发布了最新<全球容器管理预测>.预测中指出:在加速的数字化转型驱动下,到2025年全球容器管理领域市场规模将突破14亿美元,预计年复合增长率将达到2 ...