迷宫问题
描述
密密被困在一个迷宫里,迷宫有n个路口,编号为1-n。密密现在站在第一个路口,出口编号为m。先给出每个路口通向何处,问密密能否逃出迷宫。
我只能说, 这是要有多敷衍的出题人,才能想出这样的名字!
输入
多组数据,每组数据n+2行。第一行为一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口。最后一行为一个正整数m代表迷宫的终点。当n=0时输入结束。
输出
每组数据输出一行,若密密能走出迷宫,输出“YES”,否则输出“NO”。
输入样例 1
6
0 2 0
3 5 6
0 0 4
0 0 0
0 0 0
7 0 0
7
3
2 0 0
0 0 0
0 0 0
3
0
输出样例 1
YES
NO
AC 代码
#include <iostream>
using namespace std;
const int N = 100;
int a[N][3];
bool state[N]; // 表示第几个路口是否遍历过,全局数组默认全部为 0
bool tag; // 作为判断值
int out; // dfs常用技巧,将目标设置为全局变量
/*基本思路(DFS)
*/
void dfs(int u) // u 表示层数,所以从 1 开始更贴近于人的理解
{
// dfs中搜到了位置最后的终止条件应该写在前面
if (u == out)
{
tag = 1;
return ;
}
for (int i = 0; i < 3; i ++) // 遍历当前路口的三个方向
if (a[u][i] && !state[a[u][i]]) // 如果方向上的路口数不为 0,且未走过
{
state[a[u][i]] = 1;
dfs(a[u][i]);
state[a[u][i]] = 0; // 恢复现场,方便回溯
}
}
int main()
{
int n;
while (cin >> n, n)
{
tag = 0; // 表示当前遍历的路口是否走过
for (int i = 1; i <= n; i ++) // 一般树的深搜脚标从 1 开始更好理解
for (int j = 0; j < 3; j ++)
cin >> a[i][j];
cin >> out; // 注意这个为全局变量
dfs(1); // 我们从第一层开始进行深搜
if (tag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}