「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
又是一个迷宫类型的题目,不过这个要简单的多,不需要深度优先搜索,只需知道递推做法。
题目
思路
首先要看懂题目做法,迷宫一共一百个位子,然后分别让一百个人站在这一百个位子上,每个位子上有对应图标指引往哪走,最后这一百个人真正走出迷宫而不是兜圈子的一共几个?怎么算兜圈子呢?就比如现在站的位子要求要往下走,往下走了之后又要求往上走,这样就死循环了,就出不去了。一百个位子,我们分别从这一百个位子开始,指引我们往哪走就往哪走,利用函数的递归,但是有一种情况,就是绕的圈子大,我们不能够用上面这个简单的方法取判断是否在兜圈子,我们可以设一个计数器,如果走了一百次都没有走出去,总共就一百个位子,一百次还没走出去,那就证明这肯定是在兜圈子。判断是否兜圈子,那么就是五种方法了,是否上下对冲,是否下上对冲,是否左右对冲,是否右左对冲,是否走一百次还未出迷宫。每个位子都这样判断下去,最终得出有几个位子可以走出迷宫。
代码
#include <bits/stdc++.h>
using namespace std;
string m[10]={
"UDDLUULRUL",
"UURLLLRRRU",
"RRUURLDLRD",
"RUDDDDUUUU",
"URUDLLRRUU",
"DURLRLDLRL",
"ULLURLLRDU",
"RDLULLRDDD",
"UUDDUDUDLL",
"ULRDLUURRR"
};
int cnt=0;
bool judge(int i,int j){
if(cnt>=100)
return false;
if(m[i][j]=='U')
{
if(i-1<0)
return true;
cnt++;
if(m[i-1][j]=='D'){
return false;
}
else{
return judge(i-1,j);
}
}
if(m[i][j]=='D')
{
if(i+1>9)
return true;
cnt++;
if(m[i+1][j]=='U')
return false;
else
return judge(i+1,j);
}
if(m[i][j]=='L')
{
if(j-1<0)
return true;
cnt++;
if(m[i][j-1]=='R')
return false;
else
return judge(i,j-1);
}
if(m[i][j]=='R')
{
if(j+1>9)
return true;
cnt++;
if(m[i][j+1]=='L')
return false;
else
return judge(i,j+1);
}
}
int main()
{
int ans=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
cnt=0;
if(judge(i,j))
ans++;
}
}
cout<<ans;
return 0;
}