藍橋杯報名已經開始,你做好准備了嗎?
在參賽報名前,一定要做好充足的准備,除了學習算法等基礎知識外,還要學會實戰。
今天,我帶來2017年藍橋杯省賽真題,歡迎大家一起來做刷題哦~單獨戳我或移步工粽號:藍橋雲課,即可免費得藍橋杯真題庫!(PS:千萬別只看不思考不敲代碼!)
01 藍橋杯省賽真題
本題為填空題,只需要算出結果后,在代碼中使用輸出語句將所填結果輸出即可。
X 星球的一處迷宮游樂場建在某個小山坡上。它是由 10x10 相互連通的小房間組成的。 房間的地板上寫着一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:
L 表示走到左邊的房間;
R 表示走到右邊的房間;
U 表示走到上坡方向的房間;
D 表示走到下坡方向的房間。
X星球的居民有點懶,不願意費力思考。他們更喜歡玩運氣類的游戲。這個游戲也是如此!
開始的時候,直升機把 100 名玩家放入一個個小房間內。玩家一定要按照地上的字母移動。
迷宮地圖如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
請你計算一下,最后,有多少玩家會走出迷宮? 而不是在里邊兜圈子。
如果你還沒明白游戲規則,可以參看下面一個簡化的 4x4 迷宮的解說圖:
02 解題思路
(1)投機取巧式
根據“考生須知”,這題是填空題,只交答案就行了。如果不想編碼,直接用手一個個去數那 100 個點,幾分鍾就數完了,答案是 31,比編碼還要快。
(2) DFS 編碼
一道搜索題,可以選擇 dfs,代碼簡短。
#include <iostream>
using namespace std;
#include<vector>
#include<string>
using namespace std;
int ans;
vector<vector<char>>s={
{'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'}};
bool vis[100][100];
void dfs(int x,int y)
{
if(vis[x][y] == true)
return;
if(x<0||y<0||x>=s.size() || y>=s[x].size())
{
ans++;
return;
}
switch (s[x][y])
{
case 'U':
vis[x][y]= true;dfs(x-1,y);vis[x][y]= false;break;
case 'L':
vis[x][y]= true;dfs(x,y-1);vis[x][y]= false;break;
case 'R':
vis[x][y]= true;dfs(x,y+1);vis[x][y]= false;break;
case 'D':
vis[x][y]= true;dfs(x+1,y);vis[x][y]= false;break;
default:return;
}
}
void has_Path()
{
for(int i=0;i<s.size();++i)
for(int j=0;j<s[i].size();++j)
dfs(i,j);
}
int main()
{
has_Path();
cout<<ans;
}
今天的藍橋杯真題刷題就到這里了,后續我也會不定期更新藍橋杯真題講解。
如果有任何藍橋杯、代碼問題,也可以單獨私戳我,或者移步工粽號:藍橋雲課
