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

题目

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

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

输入

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

输出

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

样例输入

  1. 样例输入1
  2. 4 4 1
  3. #@##
  4. **##
  5. ###+
  6. ****
  7.  
  8. 样例输入2
  9. 4 4 2
  10. #@##
  11. **##
  12. ###+
  13. ****

样例输出

  1. 样例输出1
  2. 6
  3.  
  4. 样例输出2
  5. 4

解析

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. 结构体数组(struct
  4. int main()
  5. {
  6. 定义变量
  7. 输入、寻找起点并给初值
  8. 如果可以扩展
  9. {
  10. 指向待扩展节点
  11. for循环计算新节点数据
  12. {
  13. 计算新节点数据
  14. 如果数据满足条件
  15. {
  16. 扩展节点
  17. 如找到终点
  18. {
  19. 输出数据
  20. return 0;
  21. }
  22. }
  23. }
  24. }
  25. }

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct aa
  4. {
  5. int x,y,f;
  6. }q[123];
  7. int main()
  8. {
  9. 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];
  10. for(i=0;i<=4;i++)
  11. for(j=0;j<=4;j++)
  12. cin>>a[i][j];
  13. q[1].x=0;
  14. q[1].y=0;
  15. q[1].f=0;
  16. v[0][0]=1;
  17. head=0;
  18. tail=1;
  19. while(head<tail)
  20. {
  21. head++;
  22. for(i=0;i<4;i++)
  23. {
  24. tx=dx[i]+q[head].x;
  25. ty=dy[i]+q[head].y;
  26. if(tx>=0&&ty>=0&&tx<=4&&ty<=4&&a[tx][ty]!=1&&v[tx][ty]==0)
  27. {
  28. tail++;
  29. q[tail].x=tx;
  30. q[tail].y=ty;
  31. q[tail].f=head;
  32. v[tx][ty]=1;
  33. if(tx==4&&ty==4)
  34. {
  35. while(tail!=0)
  36. {
  37. k++;
  38. answer[k][1]=q[tail].x;
  39. answer[k][2]=q[tail].y;
  40. tail=q[tail].f;
  41. }
  42. for(j=k;j!=0;j--)
  43. {
  44. printf("(%d, %d)",answer[j][1],answer[j][2]);
  45. cout<<endl;
  46. }
  47. return 0;
  48. }
  49. }
  50. }
  51. }
  52. }

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

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

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

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

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

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

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

完整代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct aa
  4. {
  5. int x,y,chuclut,step;
  6. }q[40005]; //q:队列数组
  7. int main()
  8. {
  9. 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;
  10. char a[205][205];
  11. cin>>r>>c>>t;//r,c:迷宫大小;
  12. for(i=1;i<=r;i++)//循环输入
  13. for(k=1;k<=c;k++)
  14. {
  15. cin>>a[i][k];//a:迷宫存放数组
  16. if(a[i][k]=='@')//如果找到起点
  17. {
  18. q[1].x=i;//起点入队
  19. q[1].y=k;
  20. q[1].chuclut=t;
  21. q[1].step=0;
  22. v[i][k][t]=1;//v:状态数组
  23. }
  24. }
  25. head=0,tail=1;//初始化q数组下标
  26. while(head<tail)//head,tail:q数组下标变量
  27. {
  28. head++;//指向待扩展节点
  29. for(i=0;i<4;i++)
  30. {
  31. tx=q[head].x+dx[i];//计算新坐标位置
  32. ty=q[head].y+dy[i];//dx,dy,tx,ty:新节点坐标计算变量;
  33. if(a[tx][ty]=='#')//如果新节点需要查克拉
  34. chuclut=q[head].chuclut-1;//计算新节点查克拉数量
  35. else//如果不用查克拉
  36. chuclut=q[head].chuclut;//计算新节点查克拉数量
  37. if(tx>=1&&ty>=1&&tx<=r&&ty<=c&&v[tx][ty][chuclut]==0&&chuclut>=0)//如果新节点符合入队标准
  38. {
  39. tail++;//新节点入队
  40. q[tail].x=tx;
  41. q[tail].y=ty;
  42. q[tail].chuclut=chuclut;
  43. q[tail].step=q[head].step+1;
  44. v[tx][ty][chuclut]=1;
  45. if(a[tx][ty]=='+')//如果找到终点
  46. {
  47. cout<<q[tail].step;//输出步数
  48. return 0;
  49. }
  50. }
  51. }
  52. }
  53. cout<<-1;//如果未找到终点,输出-1
  54. }

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. 升级gradle后。需要修改jenkin 编译java版本从1.8 到11

    错误提示 * What went wrong: A problem occurred evaluating project ':App'. > Failed to apply plugin 'c ...

  2. Spring 源码(12)Spring Bean 的创建过程(3)

    继续上一篇Spring Bean的创建过程的解读,上一篇介绍了Spring在创建过程中doGetBean方法,在执行过程中会调用getSingleton方法并且设置一个lambda表达式,这个lamb ...

  3. uniapp封装request方法及调用

    export default { doRequest(method, url, data) { // 如果data为空 if (!data) var data = [] var arr = [] ar ...

  4. 印尼医疗龙头企业Halodoc的数据平台转型之数据平台V2.0

    1. 摘要 数据平台已经彻底改变了公司存储.分析和使用数据的方式--但为了更有效地使用它们,它们需要可靠.高性能和透明.数据在制定业务决策和评估产品或 Halodoc 功能的性能方面发挥着重要作用.作 ...

  5. php魔术方法小结

    php魔术方法 __construct() __construct(mixed ...$values = ""): void PHP 允许开发者在一个类中定义一个方法作为构造函数. ...

  6. 多态——JavaSE基础

    多态 同一个方法可以根据对象的不同采取不同的动作 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 基本条件: 有继承关系 子类重写父类方法 父类引用指向子类对象Father f1 = ne ...

  7. GraphX 图计算实践之模式匹配抽取特定子图

    本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...

  8. CabloyJS v3.1.0支持集群及更多 🎉

    在抗疫期间,CabloyJS v3.1.0设计并开发了大量特性,并且所有相关文档已集齐.强烈建议大家试用,拍砖 特性 - 后端核心 集群: 集群现在已经成为CabloyJS的一等公民.也就是说,Cab ...

  9. 2021.05.05【NOIP提高B组】模拟 总结

    T1 给你一棵树,要求增加最少的边权是的从根到每一个叶子的长度相等 不能改变原有的最大长度 这是一个贪心:尽可能往深度小的边增加 先预处理出 \(mx_i\) 表示从 \(i\) 到叶子的最大长度 然 ...

  10. 浅谈倍增法求解LCA

    Luogu P3379 最近公共祖先 原题展现 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 \(N,M,S\),分别表示树的结点个数.询问 ...