题目链接:吃豆人

比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了。【此时先到的不一定就是时间最短的。】于是换dfs,WA。

赛后写了个炒鸡聪明的dfs,TLE,才发现时间复杂度好像是4^(n*m)。T_T

依然感觉这个dfs很棒。

bfs已AC,怎么解决的这个问题呢,如果当前位置next 被优化了则加入队列,以此优化其他位置,否则不加入队列。T_T好有道理~~~

感觉bfs和dfs好神奇的说~

dfs TLE代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <cmath>
#include <queue>
#define inf 100000000
using namespace std;char mp[30][30];struct Node{int x, y;
}st, ed, tool, temp, nxt;int vis[30][30];
double step[30][30];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
int n, m;bool check(Node temp) {if (temp.x >= 0 && temp.x < n && temp.y >= 0 && temp.y < m && !vis[temp.x][temp.y] && mp[temp.x][temp.y] != 'X') {return true;)}return false;
}void get(Node temp, Node ed) {if (temp.x == ed.x) {int minn = min(temp.y, ed.y);int maxm = max(temp.y, ed.y);for (int i=minn+1; i<maxm; ++i) {if (mp[ed.x][i] == 'X' || mp[ed.x][i] == 'S') return;}int t = abs(temp.y - ed.y);step[ed.x][ed.y] = min(step[temp.x][temp.y]+t*0.2,step[ed.x][ed.y]);}else if (temp.y == ed.y) {int minn = min(temp.x, ed.x);int maxm = max(temp.x, ed.x);for (int i=minn+1; i<maxm; ++i) {if (mp[i][ed.y] == 'X' || mp[i][ed.x] == 'S') return;}int t = abs(temp.x - ed.x);step[ed.x][ed.y] = min(step[temp.x][temp.y]+t*0.2, step[ed.x][ed.y]);}
}void dfs(Node st, Node ed, bool v) {for (int i=0; i<4; ++i) {nxt.x = st.x + dir[i][0];nxt.y = st.y + dir[i][1];if (check(nxt)) {double t = step[st.x][st.y];if (v) t += 0.5;else t += 1;step[nxt.x][nxt.y] = min(step[nxt.x][nxt.y], t);vis[nxt.x][nxt.y] = 1;get(nxt, ed);if (nxt.x == tool.x && nxt.y == tool.y) dfs(nxt, ed, true);else dfs(nxt, ed, v);}}vis[st.x][st.y] = 0;return;
}int main() {while(~scanf("%d%d", &n, &m)) {bool v = false;memset(vis, 0, sizeof(vis));for (int i=0; i<n; ++i) {for (int j=0; j<m; ++j) {step[i][j] = inf;}}getchar();for (int i=0; i<n; ++i) {for (int j=0; j<m; ++j) {scanf("%c", &mp[i][j]);if (mp[i][j] == 'P') {st.x = i, st.y = j;}else if (mp[i][j] == 'B') {ed.x = i, ed.y = j;}else if (mp[i][j] == 'S') {tool.x = i, tool.y = j;}}if (i != n-1) scanf("\n");}step[st.x][st.y] = 0;vis[st.x][st.y] = 1;dfs(st, ed, v);get(st, ed);double ans = step[ed.x][ed.y];if (ans != inf)printf("%.1lf\n", ans);else printf("-1\n");}return 0;
}

bfs AC 代码:

/*
直接一个bfs,用两个数组保存有工具和没有工具时需要的时间。
*/#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#define inf 1000000000
using namespace std;char mp[30][30];
int n, m;struct Node {int x, y, s; // 0 表示没有工具 1 表示有工具了。
}st, ed, temp, now, nxt;int step[30][30][2];int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};void bfs(Node st) {queue<Node> que;que.push(st);step[st.x][st.y][0] = 0;while(!que.empty()) {now = que.front();que.pop();if (now.x == ed.x) {int miny = min(now.y, ed.y);int maxy = max(now.y, ed.y);bool get = true;for (int y=miny+1; y<maxy; ++y) {if (mp[now.x][y] == 'X' || mp[now.x][y] == 'S') {get = false;break;}}if (get) step[ed.x][ed.y][now.s] = min(step[now.x][now.y][now.s] + 2 * (maxy - miny), step[ed.x][ed.y][now.s]);}if (now.y == ed.y) {int minx = min(now.x, ed.x);int maxx = max(now.x, ed.x);bool get = true;for (int x=minx+1; x<maxx; ++x) {if (mp[x][ed.y] == 'X' || mp[x][ed.y] == 'S') {get = false;}}if (get) step[ed.x][ed.y][now.s] = min(step[now.x][now.y][now.s]  + 2 * (maxx - minx), step[ed.x][ed.y][now.s]);}int T;for (int i=0; i<4; ++i) {nxt.x = now.x + dir[i][0];nxt.y = now.y + dir[i][1];nxt.s = now.s;if (nxt.x<0 || nxt.y<0 || nxt.x>=n || nxt.y>=m) continue;if (mp[nxt.x][nxt.y] == 'X') continue;if (now.s) T = 5;else T = 10;if (step[nxt.x][nxt.y][nxt.s] > step[now.x][now.y][now.s] + T) {step[nxt.x][nxt.y][nxt.s] = step[now.x][now.y][now.s] + T;if (mp[nxt.x][nxt.y] == 'S') {nxt.s = 1;step[nxt.x][nxt.y][1] = step[nxt.x][nxt.y][0];}que.push(nxt);}}}
}int main() {while(cin >> n >> m) {for (int i=0; i<n; ++i) {for (int j=0; j<m; ++j) {for (int k=0; k<2; ++k) {step[i][j][k] = inf;}}}for (int i=0; i<n; ++i) {for (int j=0; j<m; ++j) {cin >> mp[i][j];if (mp[i][j] == 'P') {st.x = i, st.y = j;}else if (mp[i][j] == 'B') {ed.x = i, ed.y = j;}}}st.s = 0;bfs(st);int ans = min(step[ed.x][ed.y][0], step[ed.x][ed.y][1]);if (ans == inf) cout << "-1\n";else printf("%.1lf\n", ans*1.0/10);}return 0;
}

  

转载于:https://www.cnblogs.com/icode-girl/p/5342585.html

FZU 2124 吃豆人 bfs相关推荐

  1. FZU 2124 - 吃豆人 记忆化BFS..

    题意: 吃豆人是一款非常经典的游戏,游戏中玩家控制吃豆人在地图上吃光所有豆子,并且避免被怪物抓住. 这道题没有怪物,将游戏的画面分成n*m的格子,每格地形可能为空地或者障碍物,吃豆人可以在空地上移动, ...

  2. Unity吃豆人敌人BFS广度(宽度)优先算法实现怪物追踪玩家寻路

    本人正在努力建设自己的公众号,大家可以关注公众号,此文章最近也会上线我的公众号,公众号将免费提供大量教学Unity相关内容,除了从Unity入门到数据结构设计模式外,我还会免费分享我再游戏开发中使用的 ...

  3. 【人工智能导论】吃豆人游戏(上):对抗搜索与Minimax算法

    吃豆人实验(The Pac-Man Project)简介 The Pac-Man projects were developed for UC Berkeley's introductory arti ...

  4. Python游戏开发pygame模块,Python实现吃豆人,儿时的回忆

    老规矩,先上效果图 这是一个吃豆人的小游戏.我们8090后这一代人肯定会碰到过.黄点是我们自己,红点就是怪物们.这是最原始版的电子游戏. 然后我们可以在随便一个地方新建一个游戏代码,利用这个包的代码, ...

  5. 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI AI学会玩游戏已经不是什么新鲜事了,无论是星际争霸还是王者荣耀,AI的水平都已经超过了顶级选手. 现在,AI不仅能玩游戏,还学会了造游戏. ...

  6. C语言,画吃豆人剖析

    接上一篇文章,很多人还是搞不清楚ptr1[-1]是怎么回事,可以看看这篇文章,看完的同学还是多转发的,让更多的人看到. 一道90%都会做错的指针题 偶然的一次机会在知乎上看到这个代码,里面涉及的C语言 ...

  7. 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...

    本文转载自新智元(AI_era).   新智元报道   编辑:元子 [新智元导读]近几年来,英伟达在GAN这个领域越走越远.英伟达推出"GameGAN",不需要任何底层游戏引擎,用 ...

  8. TurnipBit开发板DIY呼吸的吃豆人教程实例

    2019独角兽企业重金招聘Python工程师标准>>> 转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) ...

  9. pacman吃豆人_通过Tensorflow和强化学习实现自动化吃豆人PacMan

    介绍 在涉及GradientCrescent强化学习基础的文章中,我们研究了基于模型和基于样本的强化学习方法. 简而言之,前一类的特征是需要了解所有可能状态转换的完整概率分布,并且可以通过马尔可夫决策 ...

最新文章

  1. 总结个人项目设计保障5大原则
  2. myeclipse导入外部javaweb项目
  3. Python 元组遍历排序操作方法
  4. stringstream用法总结
  5. c语言随机数循环延迟,C语言生成随机数的函数、延时函数
  6. 习题6-5 使用函数验证哥德巴赫猜想 (20 分)
  7. 大专计算机应用技术答辩,计算机应用技术专业硕士答辩.ppt
  8. 将数据传回前端_惠普打印机被发现偷偷回传数据:隐藏极深
  9. hnu 暑期实训之相同生日
  10. mysql 主从手动切换
  11. DropdownList获取ID方法
  12. 零样本学习的相关概念——综述
  13. C# 回调函数的实现和应用场景
  14. php展厅控制系统,展厅中控系统详细介绍
  15. 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了
  16. mysql按时间查询的优化_Mysql根据时间查询日期的优化技巧
  17. 数字经济与数字化转型
  18. PS笔刷:150个天气套装
  19. 简单有道词典客户端C实现
  20. CF 111B Petya and Divisors

热门文章

  1. 0 full gc时cpu idle_Go语言中如何观察GC
  2. win7安装TensorFlow-gpu 2.3详细教程(CUDA10.1,cuDNN7)
  3. CSS基础必备知识点03
  4. Java下MySQL易用处理工具(支持XML/JavaBean)
  5. Python矩阵计算
  6. C++/C--STL API查询及免费教程网站
  7. 单应性矩阵的相关理解
  8. c语言用户自己建立数据类型,C语言程序设计学习笔记--用户建立数据类型
  9. Delphi以GDI+制作桌面歌词效果
  10. Redis(数据类型及操作指令、Java连接Redis)