1. 程式人生 > 其它 >【藍橋杯】迷宮(吳大帥)2020-1-25

【藍橋杯】迷宮(吳大帥)2020-1-25

技術標籤:dfs

1.迷宮

1.1題目描述
X星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。
房間的地板上寫著一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。他們更喜歡玩運氣類的遊戲。這個遊戲也是如此!
開始的時候,直升機把100名玩家放入一個個小房間內。玩家一定要按照地上的字母移動。
迷宮地圖如下:

UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR

請你計算一下,最後,有多少玩家會走出迷宮? 而不是在裡邊兜圈子。
輸出:輸出一個答案
為方便理解,可參考此圖

在這裡插入圖片描述

1.2解題思路

這道題要用到dfs,對於一百個點都要遍歷過去,每一個點遍歷之前都要初始化visited陣列來記錄走過的點,從而知道有沒有在兜圈子,一查到在兜圈子立即返回,繼續下一個點,如果深度搜索到了出(也就是出現座標-1或者10的時候,說明當前遍歷的點是一個答案

程式碼

#include<bits/stdc++.h>
using namespace std;
char s[10][10]={

‘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’//1 先把這個10*10的陣列寫好
};
int visited[10][10];
int ans;
void dfs(int i,int j)
{
if(i<0||i>9||j<0||j>9)//找到了出口
{
ans++;
return;
}
else{
if(visited[i][j])//說明在兜圈子,這個點不行
return;
else{
visited[i][j]=1;
if(s[i][j]‘D’) dfs(i+1,j);
if(s[i][j]
‘U’) dfs(i-1,j);
if(s[i][j]‘L’) dfs(i,j-1);
if(s[i][j]
‘R’) dfs(i,j+1);

    }
}

}
int main()
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
memset(visited,0,sizeof(visited));//每個點在遍歷的時候一定要初始化visited陣列
dfs(i,j);
}
cout<<ans;

}