蓝桥杯—迷宫(C语言解法)
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
X 星球的一处迷宫游乐场建在某个小山坡上。它是由 10×10 相互连通的小房间组成的。
房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。
X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把 100 名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?
查看原题
思路
- 想要走出迷宫,不能往返走,即先D在U就无法走出去
- 可以每个点搜索一遍,记得在每次搜索之前要将存储是否走过该点的数组重新初始化
- !!! 注意D是x+1,U是x-1
代码
#include<stdio.h>
#include<string.h>
char ch[15][15];
int vis[15][15];
int res;
void dfs(int x,int y){
if(x<0 || x>9 || y<0 || y>9){
res++;
return;
}
if(vis[x][y]) return;
vis[x][y]=1;
if(ch[x][y]=='D') dfs(x+1,y);
if(ch[x][y]=='U') dfs(x-1,y);
if(ch[x][y]=='L') dfs(x,y-1);
if(ch[x][y]=='R') dfs(x,y+1);
}
int main(){
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
scanf("%c",&ch[i][j]);
while(ch[i][j]=='\n') scanf("%c",&ch[i][j]);//!!!很重要,不然会把换行当字符读进去
}
}
for(i=0;i<10;i++){
for(j=0;j<10;j++){
memset(vis,0,sizeof(vis));//!!很重要
dfs(i,j);
}
}
printf("\n%d",res);
return 0;
}