• 7-33 地下迷宫探索 (30分)--DFS


    题目中图片的例子,这个例子里面输出的路径并不是对称的。
    比如这里输出的路径为:1 2 6 4 3 5 3 4 7 8 7 4 6 2 1,首先1264顺利常走完,然后35,到5的时候没地方走了,回到递归上一层3,3也没地方走了,返回到上一层4,4这一层中继续for循环寻找没有到达过的点,发现7可以走,所以4是走到7,7再到8,8返回上一层,到7,7这一层返回到4这一层,然后由4那一层逐层返回,所以最后是一开始的4621

    由此可见,最后输出的路径并不都是完全对称的,绝对不能只求出前一半,然后按照前一半给出后一半。

    测试用例:
    8
    10 1 1 2 2 6 6 4 4 5 5 1 1 7 7 4 4 3 3 5 7 8
    #include <iostream>
    using namespace std;
    int v, w;
    int k = 0;
    int g[1001][1001];
    int r[5000];
    int visited[1001] = { 0 };
    int cnt = 0;
    void dfs(int x)
    {
        visited[x] = 1;
        r[k++] = x;
        cnt++;
        for (int i = 1; i <= v; i++)
        {
            if (g[x][i] == 1&&!visited[i])
            {
                dfs(i);
                r[k++] = x;
            }
        }
    }
    int main()
    {
        int s;
        cin >> v >> w >> s;
        for (int i = 1; i <= v; i++)for (int j = 1; j <= v; j++)g[i][j] = g[j][i] = 0;//初始化
        for (int i = 0; i < w; i++)
        {
            int x, y;
            cin >> x >> y;
            g[x][y] = g[y][x] = 1;
        }
        dfs(s);
        for (int i = 0; i < k; i++)
        {
            cout << r[i];
            if (i != k - 1)cout << ' ';
            else if (cnt != v)cout << ' ';
        }
        if (cnt != v)cout << "0";
        return 0;
    }
  • 相关阅读:
    C. Tanya and Toys_模拟
    B. Qualifying Contest_排序
    A. Round House_数学问题
    广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)
    广搜,智能拼图(ZOJ1079)
    类似LIS+贪心(ZOJ1025)
    字符串处理(POJ1782)
    打表格,字符串处理,POJ(2136)
    二进制字符串匹配
    括号匹配问题
  • 原文地址:https://www.cnblogs.com/2020R/p/12601398.html
Copyright © 2020-2023  润新知