总时间限制: 1000ms 内存限制: 65536kB
描述
佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?

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

输入
输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。
输出
输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。
样例输入
样例输入1
输入显示不出来,大家看原题吧。http://bailian.openjudge.cn/practice/4115/
样例输入2

样例输出
样例输出1
6

样例输出2
4

题解:
这道题用BFS来做。
1、由于每一层加的时间是一样的,所以最先遇到佐助的路径一定是最优路径,所以遇到佐助就要停下来,就出答案了。
2、然而这道题有烦人的查克拉问题,可能最短路会由于全是守卫,所以查克拉不够用,必须要绕路才能走过去,所以不能按照普通的BFS一样用一个vis数组,这道题里面的每个节点的数值可能是要更新的。
3、然而肯定要有个东西作为不能继续进行下去的剪枝,不然会一直更新原来的节点,程序必然会TLE,所以,用一个maxk数组来剪枝,maxk数组存储如果要到这个节点所剩查克拉的最多是多少,如果后面又扩展出这个节点,那时间一定会大于等于上次扩展出这个节点,这时候,如果此时的所剩查克拉数还少于上一次所剩,那么肯定不是最优解,剪枝。
4、由于各个节点的值要更新,而且更新是否正确根据能否走到为判断标准,所以不如把需要更新的值写入结构体,压入队列时就一并算是更新了。

思考:
1、1个状态不够就2个状态,2个不够3个,3个不够4个,总有一种会够。
2、太弱太弱太弱
3、套路?存储一个到达这个节点所需要的**值的最大/最小值,结构体中存储把这个节点处理完了以后的值。(我其实也迷迷糊糊,看不懂自己写的这句看似是套路的东西)
4、太弱太弱太弱

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>using namespace std;struct point{int x, y, k, t;//t存储走完这一步还剩多少查克拉point(int xx, int yy, int kk, int tt) : x(xx), y(yy), k(kk), t(tt) {}
};const int maxn = 205;
const int INF = 1 << 30;
char maze[maxn][maxn];
int answer, dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int maxk[maxn][maxn];//到达这个格子还剩查克拉最大值
int m, n, t;
queue<point> q;void BFS()
{while (!q.empty()) {point now = q.front(); q.pop();if (maze[now.x][now.y] == '+') {answer = now.t;return;} else {for (int i = 0; i < 4; i++) {int tempx = now.x + dir[i][0];int tempy = now.y + dir[i][1];if (tempx < 0 || tempx >= m || tempy < 0 || tempy >= n || maxk[tempx][tempy] >= now.k) continue;//边界一定要判断清楚if (maze[tempx][tempy] == '#') {if (now.k > 0) {q.push(point(tempx, tempy, now.k - 1, now.t + 1));maxk[tempx][tempy] = now.k;}} else {q.push(point(tempx, tempy, now.k, now.t + 1));maxk[tempx][tempy] = now.k;}}}}
}int main()
{#ifndef ONLINE_JUDGEfreopen ("in.txt", "r", stdin);#endif // ONLINE_JUDGEcin >> m >> n >> t;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {cin >> maze[i][j];maxk[i][j] = -1;if (maze[i][j] == '@') {q.push(point(i, j, t, 0));maxk[i][j] = t;}}}answer = INF;BFS ();if (answer == INF) {cout << -1 << endl;} else {cout << answer << endl;}return 0;
}

百练4115 鸣人和佐助(变式BFS)相关推荐

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

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

  2. 6044:4115:鸣人和佐助

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

  3. 算法基础:4115:鸣人和佐助--广度优先搜索

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

  4. T1214 鸣人和佐助——dfs、bfs

    佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 分析 bfs 迷宫问题,求最短时间,和 拯救行动 差不多,存在打怪兽可以通过的另外条件:但是此题打怪兽不需要另耗时间,所以第一次找到的终点就是最短时 ...

  5. Bailian4115 鸣人和佐助【BFS】

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

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

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

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

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

  8. OpenJudge-021:鸣人和佐助

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

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

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

最新文章

  1. 何谓服务器托管服务?
  2. linux顺序合并多个文件,linux – 合并多个文件,保留unix中的原始序列
  3. 【用故事解读 MobX源码(一)】 autorun
  4. facebook 分享,遇到的错误
  5. 离线环境安装Django2.2(亲测)
  6. javascript --- js中prototype、__proto__、[[Propto]]、constructor的关系
  7. rss聚合模式案例_RSS的完整形式是什么?
  8. 15. 3Sum-数组
  9. 大数学家陶哲轩谈时间管理与高效工作的方法
  10. linux安装lua相关编译报错
  11. highmem 分配使用与物理地址的对应关系
  12. (Java-11)简单的银行账户模拟
  13. js打折 (批量计算9折 8折 7折
  14. wineqq解决字体问题
  15. 无线信道参数估计算法
  16. 买二送一跟买三免一有区别吗?
  17. 帆布指纹识别(canvas fingerprinting)
  18. window10下安装Elasticsearch(es)和IK分词器
  19. 星际争霸 Android手机移植版,让《星际争霸》运行在你的Android手机上
  20. 面对二维码地推无法分辨地区之间的优劣,我们该怎么做!

热门文章

  1. Python操作lxml库(Xpath篇)
  2. java生成二维码以及二维码的解码
  3. 查看windows服务、服务是否开启
  4. 三维空间中的旋转矩阵
  5. 编辑距离_Leetcode, 远景智能笔试题
  6. 正则表达式:密码必须至少包含八个字符、至少包含一个数字、小写和大写的字母以及特殊字符...
  7. LeapMotion 简介
  8. SSH服务器跳转失败
  9. 【ALM】行业方案-Polarion Variant 变体管理 - 选择、变化和决断
  10. Flink DataStream Connectors 之 Apache Kafka 连接器