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


分析

bfs

  1. 迷宫问题,求最短时间,和 拯救行动 差不多,存在打怪兽可以通过的另外条件;但是此题打怪兽不需要另耗时间,所以第一次找到的终点就是最短时间,不需要优先队列。
  2. 需要注意:关于vis的标记问题;因为显然到达 (x,y) 时如果查克拉分别剩余 a,b 这两种是不同的状态,有可能导致不同的结果,但是你只会判断第一次到达 (x,y) 的状态,所以用二维数组标记并不能解决问题。如果后面到达时的查克拉数量(剩余可用)大于之前到达的量则可以加入队列(以免走了最前面的路打野怪消耗完查克拉最后到达不了终点),关于是否走过的问题,不能用二维数组vis,要用三维数组vis 因为加上了查克拉的数量。比如走到相同的位置可能查克拉数量不一样,这也算不同的走法。vis[x][y][t]表示在(x,y)点时,查克拉还有t;
  3. int ckl = current.ckl;需要放在for(0-4)中,//当前这个队头,所能到达的每个点的ckl(所到达每个点都有ckl,在外面赋值,就让某一个点用光了)
#include<bits/stdc++.h>using namespace std;
struct node {int x, y, time, ckl;
};
int m, n, t;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char c[205][205];
int ans = 100000;
int vis[205][205][15];
queue<node> q;void bfs() {while (!q.empty()) {node current = q.front();q.pop();int x = current.x, y = current.y, time = current.time;//, ckl = current.ckl; 不能在这里赋值for (int i = 0; i < 4; i++) {int xx = x + dx[i];int yy = y + dy[i];int ckl = current.ckl;//当前这个队头,所能到达的每个点的ckl(所到达每个点都有ckl,在外面赋值,就让某一个点用光了)if (!vis[xx][yy][ckl] && xx >= 1 && yy >= 1 && xx <= m && yy <= n) {node no;if (c[xx][yy] == '*') {//遇到终点是可以走的,然后在下次bfs进行答案的选取vis[xx][yy][ckl] = 1;no.x = xx, no.y = yy, no.time = time + 1, no.ckl = ckl;q.push(no);} else {if (ckl > 0) {ckl--;vis[xx][yy][ckl] = 1;no.x = xx, no.y = yy, no.time = time + 1, no.ckl = ckl;q.push(no);}}if (c[xx][yy] == '+') {ans = no.time;return;}}}}
}int main() {std::ios::sync_with_stdio(false);cin.tie(nullptr);cin >> m >> n >> t;int x, y;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; ++j) {cin >> c[i][j];if (c[i][j] == '@') {x = i, y = j;}}}vis[x][y][t] = 1;node start;start.x = x, start.y = y, start.time = 0, start.ckl = t;q.push(start);bfs();if (ans == 100000)cout << -1;elsecout << ans;return 0;
}

dfs(TLE)

dfs一如既往的超时,看网上有的剪枝太奇妙了,自己只会简单的剪枝

#include<bits/stdc++.h>using namespace std;int m, n, t;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char c[205][205];
int ans = 10000000;
int dis[205][205];
int vis[205][205];void dfs(int x, int y, int cnt) {if (cnt >= ans || cnt > dis[x][y])return;if (c[x][y] == '+') {ans = min(ans, cnt);return;}dis[x][y] = min(dis[x][y], cnt);for (int i = 0; i < 4; ++i) {int xx = x + dx[i];int yy = y + dy[i];if (!vis[xx][yy] && xx >= 1 && yy >= 1 && xx <= m && yy <= n) {if (c[xx][yy] == '*' || c[xx][yy] == '+') {//遇到终点是可以走的,然后在下次dfs进行答案的选取vis[xx][yy] = 1;dfs(xx, yy, cnt + 1);vis[xx][yy] = 0;} else {if (t > 0) {vis[xx][yy] = 1;t--;dfs(xx, yy, cnt + 1);vis[xx][yy] = 0;t++;}}}}
}int main() {std::ios::sync_with_stdio(false);cin.tie(nullptr);cin >> m >> n >> t;memset(dis, 0x3f3f3f3f, sizeof dis);int x, y;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; ++j) {cin >> c[i][j];if (c[i][j] == '@') {x = i, y = j;}}}vis[x][y] = 1;dfs(x, y, 0);if (ans == 10000000)cout << -1;elsecout << ans;return 0;
}

T1214 鸣人和佐助——dfs、bfs相关推荐

  1. Bailian4115 鸣人和佐助【BFS】

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

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

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

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

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

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

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

  5. OpenJudge-021:鸣人和佐助

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

  6. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  7. 百练4115 鸣人和佐助(变式BFS)

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

  8. 计蒜客 鸣人和佐助 bfs

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

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

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

最新文章

  1. C++ stack容器
  2. es6与java的相似度,特斯拉Model Y对比蔚来ES6!这次对比结果出乎意料
  3. OPENCV打开图片进行边缘检测
  4. 和朱晔一起复习Java并发(五):并发容器和同步器
  5. php修改mysql数据库中的表格,如何修改mysql数据库表?
  6. [html] html5的Notification桌面通知如何请求权限?
  7. java单引号转义_Java基础入门——Java语言基础(上)
  8. 分析connection reset by peer, socket write error错误原因
  9. db2执行sql脚本
  10. JavaScript prompt函数
  11. python运算符_零基础学习 Python 之运算符
  12. 生成.pkl文件,读取.pkl文件的内容
  13. IE兼容性问题web.config设置
  14. [PAT B1020] 月饼
  15. uva 232 - Crossword Answers(纵横迷宫)
  16. mysql var和varp的区别_了解T-SQL stdev、stdevp、var和varp
  17. android 中获取所有有效网卡和对应的IP地址
  18. shell if/then/elif/else/fi
  19. autoware lidar_localizer包下的ndt_matching节点的学习
  20. 计算机应用类专业综合知识月考试卷,计算机应用类专业综合复习试题(一)

热门文章

  1. 分享一组漂亮的html5后台登陆模板
  2. Tp5自动加载创建admin和index文件夹
  3. Ubuntu下vim如何保存退出
  4. PHP破解微信图片盗链
  5. SDP(Session Description Protocol)模型介绍(RFC3264)
  6. 多媒体开发之---开源库ffmeg的log之子解析
  7. Ubuntu 10.10发布,云计算的和平使者
  8. python聚类分析实现电商用户细分(基于RFM用户价值分析模型)
  9. 正则表达式判断是否为纯数字
  10. GitLab系列3 Unicorn