迷宫问题北林数据结构实验(简单DFS)

迷宫问题

描述

密密被困在一个迷宫里,迷宫有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_57095511/article/details/121322187