藍橋杯每日一題1.3 2017省賽A組1.迷宮[DFS]
阿新 • • 發佈:2021-02-01
原題:
http://oj.ecustacm.cn/problem.php?id=1317
X星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。
房間的地板上寫著一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:
L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。他們更喜歡玩運氣類的遊戲。這個遊戲也是如此!
開始的時候,直升機把100名玩家放入一個個小房間內。玩家一定要按照地上的字母移動。
迷宮地圖如下:
------------
UDDLUULRUL
UURLLLRRRU
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------
請你計算一下,最後,有多少玩家會走出迷宮?而不是在裡邊兜圈子。
輸出
輸出一個整數表示答案
提示
為方便理解,可參考此圖
https://blog.csdn.net/weixin_43914593/article/details/112132315
(1)可以直接數出來
(2)DFS[遞迴寫法]
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<set> #include<queue> #include<stack> using namespace std; typedef long long ll; const int maxn = 110000; char map[15][15]; int ans=0; int vis[15][15]; void dfs(int x,int y) { if(x<0||x>9||y<0||y>9) { ans++; return; } if(vis[x][y]==0) { vis[x][y]=1;//!!!!!!! if(map[x][y]=='L') { dfs(x,y-1); } if(map[x][y]=='R') { dfs(x,y+1); } if(map[x][y]=='U') { dfs(x-1,y); } if(map[x][y]=='D') { dfs(x+1,y); } return ; } return; } int main() { for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { cin>>map[i][j]; } } for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { memset(vis,0,sizeof(vis)); dfs(i,j); } } cout<<ans; return 0; }