题目:
天神小学
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 148 测试通过 : 53
题目描述
《corpse party:blood drive》中有这么一段,班长筱崎亚由美拿到六鬼门的晶石,导致了涅?的暴走,天小的崩溃,靠着幸子的力量才逃出了天小。(剧情什么的不重要)
现在我们假设没有幸子,班长需要靠自己的力量逃出天神小学。可以把天神小学看作是一个二维的迷宫,每一秒都只能从当前位置走到上下左右四个相邻的格子里,因为天小一直在崩溃,所以有很多点是无法行走的。问班长能不能在天小完全崩溃,即t秒内逃出天神小学。
输入
第一行一个整数T,表示数据组数
每组数据第一行输入3个整数n,m,t分别表示迷宫的行数,列数,以及距离天小崩溃剩余的时间。(3≤n,m≤20,t≤100)
接下来输入n行,每行有一个长度为m的字符串。
其中字符’.’表示可以通行
字符’*’表示无法通行
字符’O’表示出口
字符’X’表示班长的起始位置
输出
若能逃离 输出 "happy end"
否则输出 "bad end"
样例输入
2
5 5 13
.....
.***.
.*X*O
.*.*.
...*.
5 5 14
.....
.***.
.*X*O
.*.*.
...*.
样例输出
bad end
happy end
题目来源
kojimai
题目分析:
搜索题。以下代码能够AC,但我不知道是否正确理解了出题人的意思,以下代码仅供参考。用的是DFS来做。
代码如下:
/* * a.cpp * * Created on: 2015年2月24日 * Author: Administrator */ #include <iostream> #include <cstdio> using namespace std; const int maxn = 25; char map[maxn][maxn]; //地图矩阵.用于存储地图的情况 int n; //行数 int m; //列数 int t; //目标时间 int x1, y1; //起点 int x2, y2; //终点 int dir[4][2] = { //方向矩阵 { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; /** * 判断下一步是否合法 */ bool check(int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m) { //如果坐标越界 return false; //则表明下一步不合法 } return true; //否则下一步合法 } /** * DFS。 * si:当前结点的行数 * sj:当前节点的列数 * cnt:到达(si,sj)是所用的时间 */ bool dfs(int si, int sj, int cnt) { if (si == x2 && sj == y2 && cnt <= t) { //如果在指定时间内到达目标点 return true; //返回true } int i; for (i = 0; i < 4; ++i) { //遍历当前节点的相邻结点 int tempi = si + dir[i][0]; //计算下一节点的坐标 int tempj = sj + dir[i][1]; if (check(tempi, tempj) == false) { //如果计算出来的下一届点的坐标不合法 continue; //则跳过这一结点,计算下一结点 } if (map[tempi][tempj] != ‘*‘) { //如果当前节点不是墙壁 map[tempi][tempj] = ‘*‘; //江当前节点设置为墙壁 bool flag = dfs(tempi, tempj, cnt + 1); //沿着这一节点往下搜 if (flag == true) { //如果这一条路径可行 return true; //则返回true.表示目标节点可以到达 } //当知心以下代码的时候表示通过这一节点无法到达目标节点 map[tempi][tempj] = ‘.‘; //拿奖当前节点重新设置成‘.‘可用状态 } } return false; //如果经过上面都无法找到一条路径.那么到现在的时候就已经表明目标节点无法到达 } int main() { int ttt; scanf("%d", &ttt); while (ttt--) { scanf("%d%d%d", &n, &m, &t); int i; int j; for (i = 0; i < n; ++i) { cin >> map[i]; } int wall = 0; //用于包村墙壁的数量 for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) { if (map[i][j] == ‘X‘) { //记录起点的位置 x1 = i; y1 = j; } else if (map[i][j] == ‘O‘) { //记录终点的位置 x2 = i; y2 = j; } else if (map[i][j] == ‘*‘) { //统计墙壁的数量 wall++; } } } map[x1][y1] = ‘*‘; //奖起点设置为墙壁‘x‘ bool result = dfs(x1, y1, 0); //从起点开始遍历 if (result == true) { //如果resultweighttrue,表明有这么一条路径 printf("happy end\n"); } else { printf("bad end\n"); //否则表明没有这样一条路径 } } return 0; }
时间: 2024-11-09 11:24:45