X星球的一处迷宫游乐场建在某个小山坡上。 它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。 我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间, R表示走到右边的房间, U表示走到上坡方向的房间, D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。 他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。 玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫? 而不是在里边兜圈子。
请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。
如果你还没明白游戏规则,可以参看一个简化的4x4迷宫的解说图: p1.png
这是一个深搜的题目。思路就是标记加上深搜,每进入一个房间要按照指示搜索下一个房间,搜索过的房间要标记为1,如果进入了之前搜过的房间则意味着陷入了循环,出不去。就例如在里面按照指示转圈,先up进入上面的房间,上面的房间写的又是down,就出不去了。
我用C语言写了一个4*4的迷宫,10*10也是一个道理,改一改参数就可以了。
#include<stdio.h>
#include <string.h>
int i,j,res,ans=0;
int vis[4][4]={{0},{0}};
char data[4][4]={{'U','L','D','L'},{'R','R','U','L'},{'L','R','D','L'},{'U','L','L','R'}};
int dfs(int i,int j)
{
if(i<0||i>3||j<0||j>3)//超出边界,走出迷宫
return true;
if (vis[i][j]==1)//这个房间之前走过,陷入循环,无法出去
return false;
vis[i][j]=1;//标记曾经搜索过
switch(data[i][j]){
case 'U':
return dfs(i-1,j);
case 'D':
return dfs(i+1,j);
case 'L':
return dfs(i,j-1);
case 'R':
return dfs(i,j+1);
default:
return false;
}
}
int main(void)
{//遍历每一个房间
for(i=0;i<4;i++){
for(j=0;j<4;j++){
memset(vis,0,sizeof(vis));//清空标记
res=dfs(i,j);
printf("%d",res);
if(res)
ans++;//走出去了,加1
}
}
printf("\n%d",ans); return 0;}