1. 程式人生 > >2017第八屆藍橋杯省賽Java A組--迷宮

2017第八屆藍橋杯省賽Java A組--迷宮

標題:迷宮

X星球的一處迷宮遊樂場建在某個小山坡上。
它是由10x10相互連通的小房間組成的。

房間的地板上寫著一個很大的字母。
我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,
R表示走到右邊的房間,
U表示走到上坡方向的房間,
D表示走到下坡方向的房間。

X星球的居民有點懶,不願意費力思考。
他們更喜歡玩運氣類的遊戲。這個遊戲也是如此!

開始的時候,直升機把100名玩家放入一個個小房間內。
玩家一定要按照地上的字母移動。

迷宮地圖如下:
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR

------------

請你計算一下,最後,有多少玩家會走出迷宮? 
而不是在裡邊兜圈子。
請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多餘的內容。

如果你還沒明白遊戲規則,可以參看一個簡化的4x4迷宮的解說圖:




此題為第一題,填空題只需要算出結果即可,難度較低。

遍歷每一個人的座標,讓其一直吵著箭頭方向行走,走過的房間標記為cover[x][y]=1,

直到走出去或是繞圈圈(再次遇到cover[x][y]=1的房間)。

程式碼如下:

public class Main{
	static int ok = 0,res = 0;
	static char road[][] = new char[][]{{'U','D','D','L','U','U','L','R','U','L'},
		{'U','U','R','L','L','L','R','R','R','U'},
		{'R','R','U','U','R','L','D','L','R','D'},
		{'R','U','D','D','D','D','U','U','U','U'},
		{'U','R','U','D','L','L','R','R','U','U'},
		{'D','U','R','L','R','L','D','L','R','L'},
		{'U','L','L','U','R','L','L','R','D','U'},
		{'R','D','L','U','L','L','R','D','D','D'},
		{'U','U','D','D','U','D','U','D','L','L'},
		{'U','L','R','D','L','U','U','R','R','R'}};
	static int cover[][] = new int[10][10];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){
				ok = 0;
				cover = new int[10][10];
				dfs(i,k);
				if(ok==1){
					res++;
					//System.out.println(i+","+k); 輸出能走出迷宮的人的座標,方便檢查結果
				}
			}
		}
		System.out.println(res);
	}
	static void dfs(int x,int y){
		if(x==-1||x==10||y==-1||y==10){
			ok = 1;
			return;
		}
		if(cover[x][y]==1) return;
		cover[x][y] = 1;
		if(road[x][y]=='U'){
			dfs(x-1,y);
		}
		else if(road[x][y]=='D'){
			dfs(x+1,y);
		}
		else if(road[x][y]=='L'){
			dfs(x,y-1);
		}
		else if(road[x][y]=='R'){
			dfs(x,y+1);
		}
	}
}