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

Input
输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。
Output
输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。

分析:所有由head变为tail的数据都要知道,不能漏掉,如head.t怎么变为tail.t不写,就q.push(tail) ,这样下面用到的tail可能是其他组的。 book数组必须把金克拉数量也标记上,因为后边head进入也会走到原来位置上, 金克拉数量可能比第一次多。广搜队列中第一次搜到的终点用时是最短的。
ac代码:

#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,t,flag=0,vis[11][210][210];
char a[210][210];
struct node
{int x;int y;int t;//金克拉 int s;//时间
};
int jud(int x,int y)
{if(x>=0&&y>=0&&x<n&&y<m)return 1;return 0;
}
void bfs(int x,int y)
{int i; int ne[4][2]={0,1,0,-1,1,0,-1,0};queue<node> q;node head,tail;head.x=x;head.y=y;head.t=t;head.s=0;q.push(head);vis[head.t][head.x][head.y]=1;while(!q.empty()){head=q.front();q.pop();if(a[head.x][head.y]=='+'){flag=1;printf("%d\n",head.s);return;}for(i=0;i<4;i++){tail.x=head.x+ne[i][0];tail.y=head.y+ne[i][1];tail.s=head.s+1;tail.t=head.t;
//尽可能都写在前边,写下边//那里就WA了,因为不写的话下一行vis[tail.t]用的是上一个的; if(jud(tail.x,tail.y)&&!vis[tail.t][tail.x][tail.y]){if(a[tail.x][tail.y]=='#'){if(head.t>0){vis[tail.t][tail.x][tail.y]=1;//确定金克拉有再标记,否则后面会影响; tail.t=head.t-1;q.push(tail);}else continue;}else{vis[tail.t][tail.x][tail.y]=1;//tail.t=head.t;q.push(tail);}    }}}
}
int main()
{int i,j,x,y;scanf("%d%d%d",&n,&m,&t);for(i=0;i<n;i++){scanf("%s",a[i]);for(j=0;j<m;j++){if(a[i][j]=='@')x=i,y=j;}}flag=0;bfs(x,y);if(flag==0)printf("-1\n");return 0;
}

本题主要对金克拉数量进行记忆化;

鸣人和佐助(记忆化广搜)相关推荐

  1. 第9周测验-鸣人和佐助

    021:鸣人和佐助 1. 题目详情 描述 输入 输出 样例输入 样例输出 2.思路分析 2.1 整体思路 2.2 限制条件处理 2.3 剪枝 3.注意点 4.AC代码 5.总结 1. 题目详情 描述 ...

  2. OpenJ_Bailian——4115鸣人和佐助(带状态的A*)

    鸣人和佐助 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Desc ...

  3. Bailian4115 鸣人和佐助【BFS】

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

  4. O - 鸣人和佐助(BFS)

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

  5. OpenJudge-021:鸣人和佐助

    OpenJudge-021:鸣人和佐助 题目描述: 题目传送门:添加链接描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...

  6. 鸣人和佐助 计蒜客--1214 广搜 三维数组

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

  7. 鸣人和佐助———三维数组标记踪迹,形象理解记忆

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

  8. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

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

  9. 鸣人和佐助(广度搜索)

    (博主最近去研究深搜和广搜去了,鸽一会.) 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有 ...

最新文章

  1. 【Linux】查询文件中指定字符串的记录
  2. myeclipse:web项目不能显示Web App Libraries
  3. GitHub Copilot 支持 IntelliJ IDEA啦,插件装起来!
  4. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中
  5. Mac 如何恢复出厂设置
  6. Django学习笔记第三篇--关于响应返回
  7. Java从键盘获取输入各种类型的数据方式
  8. 马斯克如何通过生小孩统治世界?
  9. dede文章异步ajax加载,织梦DedeCMS列表“加载更多”“无限下拉”Ajax加载使用方法...
  10. 数组:正整数数组分成2组使其和的差的绝对值最小
  11. 51nod1433--简单数学
  12. java集合学习笔记--二维集合HashMap
  13. batchnomal_Linux Kernel 排程機制介紹 ? Loda's blog
  14. 初学计算机应该学些什么,学电脑要先学什么 学电脑要学习什么知识
  15. js破解 X笔网登录
  16. 打开终端如何自动进入conda环境
  17. css怎么画小方块,CSS3 小方块矩阵变换动画
  18. Android游戏音效实现
  19. 计算机硬件信息被修改怎么还原,修改bios硬件信息方法
  20. 这五大采购流程最需要实现自动化

热门文章

  1. 公司旅游--金华武义二日游
  2. Rational Software Architect 的介绍和基础教程
  3. 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
  4. python计算机体系三层结构_python学习笔记-计算机结构、操作系统
  5. STM32 CubeMX学习:7. ADC模数转化
  6. html5 i标签什么意思,快速了解HTML5 b和i标签
  7. 视频号一场书法直播近20万人观看
  8. 发布H5时,提示文件查找失败
  9. 开源软件和商业软件版本的介绍:alpha、beta、rc、GA等等
  10. java人民币大小写转换_人民币大小写转换 java 实现