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;
}

 

posted @ 2020-03-30 21:33  幻想Elapse  阅读(383)  评论(0编辑  收藏  举报