题目描述如下:

说好了,题目不黑人。

给你一个8*8的矩阵,你的初始位置是左下角方格(用'U’表示),你的目标位置是右上角的方格(用'A'表示),其余的62个方格,如果是'.',表示这个方格为空,如果是'S',表示这个方格有一块大石头。好了现在你开始从左下角出发,每次可以往上,下,左,右,左上,右上,左下,右下移动一个方格,或者你可以原地不动,一共九个动作方式,在你做完一个动作后,所有的大石头会往下掉一个方格(如果一个大石头的位置是(x,y),那下一秒是(x+1,y),不过如果它已经在最下面的一排了,那它就会掉出矩阵,不再出现),请注意,任一时刻,你不能和某一个大石头处在同一个方格,否则石头会把你XX掉。

现在的问题就是:你能从左下角安全抵达右上角么? 如果能,输出“Yes”,反之,“No”。

输入:

T->测试数据组数(T)。

对于每组数据,输入一个8*8的矩阵,其后有一空行。描述如上。

输出:

对于第i组数据,请输出

Case #i: s(s是一个字符串,如果可以到达,则s为“Yes”,反之“No”)

样例:

2
.......A
........
........
........
........
........
........
U..............A
........
........
........
........
.S......
S.......
US......

output:

Case #1: Yes
Case #2: No

本题就是一个BFS,这是因为每走一步,石头都会变化。而超过8步之后,所有的石头都不见了,只要小人还活着就能走出去。

想要处理每一步的时候迷宫状态不改变,就是用BFS。我将每一步都当做一个函数,将当前步小人可能存在的位置当做参数输入。

其中与网上题解不同的是,我认为在单步中不能出现两个重复的位置入队。否则一个多余的位置会导致倍时间消耗。加入单步去重后,效率提升了100倍左右。

请务必注意,case 的num是从1开始的,不是0!!

#include<cstdio>
#include<queue>
#include<cstring>using namespace std;
struct pos {int x;int y;pos(int a, int b) {x = a;y = b;};pos() {};bool equal(pos b) {return (b.x == x && b.y == y);}
};char miGong[8][8];int wx[9] = { 0,-1,0,1,-1,-1,1,1,0 };
int wy[9] = { -1,0,1,0,-1,1,1,-1,0 };void debugMG() {printf("\n");for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {printf("%c", miGong[i][j]);}printf("\n");}
}int judge(int x, int y) {if (x<0 || x >7 || y<0|| y >7)return false;if (miGong[x][y] == 'S')return false;return true;
}bool myBFS(int step, queue<pos> posQue) {if (posQue.empty()) {//return false;}if (step >= 8) return true;//第8步清空障碍,只要能活着就一定能安全到达queue<pos>nowQue;bool reached[8][8];memset(reached, 0, sizeof(reached));while (!posQue.empty()) {pos before = posQue.front();int nx = before.x, ny = before.y;if (miGong[nx][ny] == 'S') {//不应当返回posQue.pop();//不在考虑从这里出发的情况continue;}else {for (int i = 0; i < 9; i++){int new_x = nx + wx[i];int new_y = ny + wy[i];if (judge(new_x, new_y)&&reached[new_x][new_y]==0){pos node = pos(new_x, new_y);reached[new_x][new_y] = 1;nowQue.push(node);}}}posQue.pop();}for (int i = 7; i >= 0;i--) {for (int j = 0; j < 8; j++) {if (miGong[i][j] == 'S') {miGong[i][j] = '.';if (i + 1 < 8) {miGong[i+1][j] = 'S';}}}}//石头落下//debugMG();return myBFS(step + 1, nowQue);
}int main() {//freopen("output.txt", "w", stdout);int t;char thing;scanf("%d", &t);for (int i = 0; i < t; i++) {getchar();for (int m = 0; m < 8; m++) {for (int n = 0; n < 8; n++) {scanf("%c", &thing);miGong[m][n] = thing;}getchar();//输入换行}//input m*n //BFSqueue<pos> posQue;posQue.push(pos(7,0));int step = 0;bool cando = myBFS(step, posQue);if (cando) {printf("Case #%d: Yes\n", i+1);}else {printf("Case #%d: No\n", i+1);}}return 0;
}

codeup DFS or BFS?题解相关推荐

  1. PAT甲级1099 Build A Binary Search Tree (30分):[C++题解]建立二叉搜索树、dfs和bfs

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的结构,和待填的数值,请将数据填到二叉树中的结点中,使之满足二叉搜索树的性质. 然后按照层序遍历输出数值. 分析: 本题分两步. 第一步 ...

  2. L2-031 深入虎穴 (25 分) Java题解 (树的最大深度dfs,bfs)

    输入样例: 13 3 2 3 4 2 5 6 1 7 1 8 1 9 0 2 11 10 1 13 0 0 1 12 0 0 输出样例: 12 解题思路: 找最大深度的编号,由于答案唯一,所以宽搜到的 ...

  3. LeetCode算法题7:DFS和BFS

    文章目录 前言 深度优先搜索算法伪代码: 广度优先搜索算法伪代码: 一.图像渲染 DFS: BFS: 上面BFS算法存在的问题: 修改 1: 修改 2: 二.岛屿的最大面积 DFS: BFS : 三. ...

  4. 算法---DFS和BFS

    一 : 什么是DFS和BFS? 转载自 : 什么是DFS和BFS? 简介: 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search ...

  5. 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    (https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...

  6. DFS与BFS 的爱恨情仇

    前言 算法的过渡点,也就是从这里开始真正的代码强度开始展现,DFS和BFS必须掌握,才能有进一步发展的空间 DFS,深度遍历,也就是一口气走到头不撞南墙不回头,同时它很讲究递归,也就是兜兜转转终是你的 ...

  7. 数据结构基础(21) --DFS与BFS

    DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...

  8. 连通图的判断(并查集, DFS, BFS)

    首先要明确什么是连通图??? 连通图:对于一个图来说,图中的任意一个点都能访问到所有的点,则说明该图连通 很明显,如果要判断一个图是否连通,则必须要从任意一个搜索一遍,判断是否到达了所有的点,则很快会 ...

  9. python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS

    博主以前有一个疑问,DFS和BFS各自的适用范围是?我想你今天看了这篇文章之后会有一个判断! BFS 数据结构与算法分析:c语言描述(p217) 已经存在一个Indgree入度数组(indgree[v ...

最新文章

  1. opencv mat与avframe互转
  2. Redux学习(2) ----- 异步和中间件
  3. 输出字母沙漏+对称字符串
  4. 30秒无需编码完成一个REST API服务
  5. android性能测试工具之dumpsys
  6. bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
  7. 魅族智能识屏怎么用才算是高科技?
  8. 重做 oracle_Oracle数据库基本知识(1)-数据库(1)
  9. ThinkPHP实现登陆功能
  10. 超详细尚硅谷mysql 分组函数
  11. 10-ret/retf+call+mul
  12. Javaweb中EL 表达式和JSTL 的使用
  13. matlab时域采样与频域采样,实验二:时域采样与频域采样.doc
  14. 计算机主机不启动的故障,电脑不能正常启动的原因及解决方法
  15. H3C防火墙-安全域配置举例
  16. 永恒之蓝(勒索病毒)
  17. nc65右键生成菜单_NC65管理员层级管控
  18. Win7电脑右下角声音图标小喇叭出现红叉没有声音解决方案
  19. 台式机外接显示器后没有声音
  20. LAMP基础环境的搭建,即Linux、Apache、MySQL、PHP环境

热门文章

  1. 网站分析实战——如何以数据驱动决策:提升网站价值
  2. 论文阅读——基于文档主题结构的关键词抽取方法研究(理解)
  3. 基于大疆EP和Opencv完成人脸跟随项目
  4. Gox语言中的并发处理以及用通道实现数据安全共享-GX21
  5. 显微病理PACS系统源码 医院系统源码 HIS源码
  6. 京东上货工具哪个好?怎么抓取商品上传?
  7. iis配置网站服务器配置端口,IIS服务器配置IP与端口
  8. 使用GridView实现仿微信发朋友圈添加图片,点击预览、删除图片
  9. 抄书《统计学习方法(第2版)》
  10. jQuery判断复选框是否被选中的3种方式