藍橋杯之迷宮
阿新 • • 發佈:2019-01-29
問題描述:
標題:迷宮
X星球的一處迷宮遊樂場建在某個小山坡上。
它是由10x10相互連通的小房間組成的。
房間的地板上寫著一個很大的字母。
我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,
R表示走到右邊的房間,
U表示走到上坡方向的房間,
D表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。
他們更喜歡玩運氣類的遊戲。這個遊戲也是如此!
開始的時候,直升機把100名玩家放入一個個小房間內。
玩家一定要按照地上的字母移動。
迷宮地圖如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------
請你計算一下,最後,有多少玩家會走出迷宮?
而不是在裡邊兜圈子。
請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多餘的內容。
思路:
本來想的是類似求解迷宮問題的深搜,發現它無法遍歷每個點,還不如兩層迴圈來得快,判斷每個點,然後用深搜,每走一步標記陣列對應值改變為 1,超出邊界符合題意,移動到標記陣列值為 1 則表示兜圈子,直到所有點判斷結束。
#include <iostream> using namespace std; int mg[10][10] = { {1,2,2,3,1,1,3,4,1,3}, {1,1,4,3,3,3,4,4,4,1}, {4,4,1,1,4,3,2,3,4,2}, {4,1,2,2,2,2,1,1,1,1}, {1,4,1,2,3,3,4,4,1,1}, {2,1,4,3,4,3,2,3,4,3}, {1,3,3,1,4,3,3,4,2,1}, {4,2,3,1,3,3,4,2,2,2}, {1,1,2,2,1,2,1,2,3,3}, {1,3,4,2,3,1,1,4,4,4} }; int index[10][10]; int count = 0; void Reset() { for(int i = 0; i<10; i++) for(int j = 0; j<10; j++) index[i][j] = 0; } int dfs(int s1,int s2) { Reset(); while(1) { if(s1<0 || s1 >9 || s2<0 || s2>9) return 1; if(index[s1][s2] == 1) return 0; index[s1][s2] = 1; switch(mg[s1][s2]) { case 1: s1--; break; case 2: s1++; break; case 3: s2--; break; case 4: s2++; break; } } } void Find() { for(int i = 0; i<10; i++) for(int j = 0; j<10; j++) count += dfs(i,j); } int main() { Find(); cout<<count; return 0; }