1. 程式人生 > >藍橋杯之迷宮

藍橋杯之迷宮

問題描述:


標題:迷宮

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;
}