標籤:
題目:
天神小學時間限制(普通/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;}
NOJ 網路賽 D題 天神小學