鸣人和佐助———三维数组标记踪迹,形象理解记忆
佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?
已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费 11 个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?
输入格式
输入的第一行包含三个整数:MM,NN,TT。代表 MM 行 NN 列的地图和鸣人初始的查克拉数量 TT。0 < M,N < 2000<M,N<200,0 \le T < 100≤T<10
后面是 MM 行 NN 列的地图,其中 @ 代表鸣人,+ 代表佐助。* 代表通路,# 代表大蛇丸的手下。
输出格式
输出包含一个整数 RR,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出 -1。
Sample Input
4 4 1
#@##
**##
###+
****
Sample Output
6
Sample Input 2
4 4 2
#@##
**##
###+
****
Sample Output 2
4
bfs本质上就是暴力,一个一个试答案,就好比在一张迷宫地图上试,如果不行就打叉,去尝试下一个可能的答案,这个过程是沿着墙走的不会说是破墙走吧,这一题就可以形象的理解为我有几次机会破墙,破墙走出迷宫的意思,但是之前的二维数组的意思是我走过这条路以后就不会走了,然后用二维数组储存来过,但是如果用破墙的方法的话,可能就会走到重复的路了,想想一下你在打游戏,每次都会记录复活地方,你在这个时候要是还按照二维数组储存的话,是不是脚下的路,已经被标记过了,那你肯定走不出来,所以要每次破墙以后重新来标记一个维度来表示新的路径,如果不标记,就直接返回-1,表无路可走了,这是本题的难点,所以重点说一下 (三维数组)
下面是详细的代码
#include<iostream> #include<queue> using namespace std; char map[202][202]; bool vis[202][202][15]; int x,y,mx,my; int m,n,t;//m行n列t查克拉 struct pos {int x,y;//当前位置int s;//路程所需时间int p;//当前还有多少能量 } cur,nex; queue <pos> q; bool in(int x ,int y ) {return 0<=x&&x<m && 0<=y&&y<n; }int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; int bfs (int x ,int y ,int p) {vis[x][y][p]=1;cur.p=p;cur.x=x;cur.y=y;cur.s=0;q.push(cur);while(q.size()){cur=q.front();q.pop();for(int i=0;i<4;i++){int dx=cur.x+dir[i][0];int dy=cur.y+dir[i][1];if(dx==mx && dy==my )return cur.s+1;if(in(dx,dy)){if(map[dx][dy]=='*'&& !vis[dx][dy][cur.p]){nex.x=dx,nex.y=dy,nex.s=cur.s+1;nex.p=cur.p;q.push(nex);vis[dx][dy][cur.p]=1;}if(map[dx][dy]=='#'&&!vis[dx][dy][cur.p-1]&&cur.p>0){nex.x=dx,nex.y=dy,nex.s=cur.s+1;nex.p=cur.p-1;q.push(nex);vis[dx][dy][cur.p-1]=1;}}}}return -1; }int main() {cin>>m>>n>>t;for(int i=0;i<m;i++)for(int j=0;j<n;j++){cin>>map[i][j];if(map[i][j]=='@'){x=i;y=j;}if(map[i][j]=='+'){mx=i;my=j;}}cout<<bfs(x,y,t);return 0;}
鸣人和佐助———三维数组标记踪迹,形象理解记忆相关推荐
- O - 鸣人和佐助(BFS)
O - 鸣人和佐助 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...
- OpenJudge-021:鸣人和佐助
OpenJudge-021:鸣人和佐助 题目描述: 题目传送门:添加链接描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...
- 第9周测验-鸣人和佐助
021:鸣人和佐助 1. 题目详情 描述 输入 输出 样例输入 样例输出 2.思路分析 2.1 整体思路 2.2 限制条件处理 2.3 剪枝 3.注意点 4.AC代码 5.总结 1. 题目详情 描述 ...
- OpenJ_Bailian——4115鸣人和佐助(带状态的A*)
鸣人和佐助 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Desc ...
- Bailian4115 鸣人和佐助【BFS】
4115:鸣人和佐助 总时间限制: 1000ms 内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上 ...
- 鸣人和佐助 计蒜客--1214 广搜 三维数组
题目链接 题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大 ...
- T1214 鸣人和佐助——dfs、bfs
佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 分析 bfs 迷宫问题,求最短时间,和 拯救行动 差不多,存在打怪兽可以通过的另外条件:但是此题打怪兽不需要另耗时间,所以第一次找到的终点就是最短时 ...
- 计蒜客题解——T1214:鸣人和佐助
题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...
- 鸣人和佐助(记忆化广搜)
我是传送门 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置.鸣人有一定数量的查克拉,每一个单 ...
最新文章
- 骑士卡:基于Kafka搭建消息中心,上亿消息推送轻松完成
- CString、std::string格式化字符串
- mapinfo制作地图_Mapinfo操作不太会?看这篇就够了
- HTML+CSS+JS实现 ❤️翻页倒计时ui特效❤️
- 搭建Dubbo开发学习环境——补充新版本的Dubbo-Admin的编译和执行过程
- SQL恢复挂起的原因和措施解析
- JVisualVM的使用实录
- html设置ie9兼容性视图,ie9兼容性视图设置方法
- killer queen ctf
- 海盗湾(The Pirate Bay)的战争——每一名技术人员都应该思考的问题
- Jmeter录制脚本,HTTP代理服务器介绍使用
- HC3i论坛医疗信息化热门资源100个
- GM7150,振芯科技,视频解码器,CVBS转BT656/601,QFN32,替换TVP5150/CJC5150
- 【温故知新】—— React/Redux/React-router4基础知识独立团Demo
- 最新阿里巴巴面试题合集附带答案,答对70%你也可以进阿里(天猫+蚂蚁金服+阿里巴巴)
- 单个Java文件打成可执行JAR包
- windows下mysql免安装配置
- 屏蔽 Alt+F4 和 Escape 键
- 10个高质量的简历制作网站推荐
- 阿里妈妈广告商品点击数据分析