題目描述
X星球的一處迷宮游樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。
房間的地板上寫着一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。他們更喜歡玩運氣類的游戲。這個游戲也是如此!
開始的時候,直升機把100名玩家放入一個個小房間內。玩家一定要按照地上的字母移動。
迷宮地圖如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------
請你計算一下,最后,有多少玩家會走出迷宮? 而不是在里邊兜圈子。
房間的地板上寫着一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。他們更喜歡玩運氣類的游戲。這個游戲也是如此!
開始的時候,直升機把100名玩家放入一個個小房間內。玩家一定要按照地上的字母移動。
迷宮地圖如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------
請你計算一下,最后,有多少玩家會走出迷宮? 而不是在里邊兜圈子。
輸出
輸出一個整數表示答案
提示
為方便理解,可參考此圖
答案:31
DFS:
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<string.h> using namespace std; char a[15][15]; int vis[15][15]; int ans = 0; void dfs(int i, int j) { if (i < 0 || i>9 || j < 0 || j>9) //迷宮的出口 { ans++; return; } else { if (vis[i][j]) return; //如果已經搜過,直接返回 vis[i][j] = 1; //標記已搜索 if (a[i][j] == 'L') dfs(i, j - 1); if (a[i][j] == 'R') dfs(i, j + 1); if (a[i][j] == 'U') dfs(i - 1, j); if (a[i][j] == 'D') dfs(i + 1, j); } } int main() { int i, j; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) cin >> a[i][j]; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) { memset(vis, 0, sizeof(vis)); //搜索每一個房間時,初始化搜搜數組 dfs(i, j); } cout << ans << endl; return 0; }
暴力:
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<string.h> using namespace std; char a[15][15],c[15][15]; int vis[15][15]; int ans = 0; int main() { for (int i = 0; i < 10; i++) { for(int j=0;j<10;j++) { cin>>a[i][j]; c[i][j]=a[i][j]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { int x = i, y = j; memset(vis, 0, sizeof(vis)); while (1) { if (a[x][y] == 'U') { x = x - 1; if (x < 0 || x>9 || y < 0 || y>9) { ans++; c[i][j]='#'; break; } if (vis[x][y] == 0) vis[x][y] = 1; else break; } if (a[x][y] == 'L') { y = y - 1; if (x < 0 || x>9 || y < 0 || y>9) { ans++; c[i][j]='#'; break; } if (vis[x][y] == 0) vis[x][y] = 1; else break; } if (a[x][y] == 'R') { y = y + 1; if (x < 0 || x>9 || y < 0 || y>9) { ans++; c[i][j]='#'; break; } if (vis[x][y] == 0) vis[x][y] = 1; else break; } if (a[x][y] == 'D') { x = x + 1; if (x < 0 || x>9 || y < 0 || y>9) { ans++; c[i][j]='#'; break; } if (vis[x][y] == 0) vis[x][y] = 1; else break; } } } } cout << ans << endl; // for(int i=0;i<10;i++) // { // for(int j=0;j<10;j++) // cout<<c[i][j]; // cout<<endl; // } return 0; }