HDOJ-2181(深搜记录路径)

哈密顿绕行世界问题

HDOJ-2181

1.本题是典型的搜索记录路径的问题
2.主要使用的方法是dfs深搜,在输入的时候对vector进行排序,这样才能按照字典序输出。
3.为了记录路径,我使用的是两个vector,每次找到结果时,将一个vector赋值给另一个,再去输出。在dfs遍历顶点vector的时候,先push_back一个要搜的点,递归回来以后再pop_back
4.本题注意输出的格式

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
vector<int> v[21];
vector<int> trace;
vector<int> t;
bool vis[21];
int m;
int cnt=0;
void print(){
    t.pop_back();
    cout<<cnt<<":  "<<m<<" ";
    for(int i=0;i<t.size();i++){
        cout<<t[i]<<" ";
    }
    cout<<m<<endl;
}
void dfs(int u,int ans){
    if(u==m&&ans>=20){
        t=trace;
        cnt++;
        print();
        return;
    }
    for(int i=0;i<v[u].size();i++){
        if(!vis[v[u][i]]){
            vis[v[u][i]]=1;
            trace.push_back(v[u][i]);
            dfs(v[u][i],ans+1);
            vis[v[u][i]]=0;
            trace.pop_back();
        }
        if(v[u][i]==m&&ans==19){
            trace.push_back(v[u][i]);
            dfs(v[u][i],ans+1);
            trace.pop_back();
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a;
    for(int i=1;i<=20;i++){
        for(int j=0;j<3;j++){
            cin>>a;
            v[i].push_back(a);
        }
        sort(v[i].begin(),v[i].end());
        //cout<<v[i][0]<<" "<<v[i][1]<<" "<<v[i][2]<<endl;
    }
    while(cin>>m&&m){
        memset(vis,0,sizeof(vis));
        vis[m]=1;
        cnt=0;
        dfs(m,0);
    }
    //system("pause");
    return 0;
}
posted @ 2019-08-04 21:07  Garrett_Wale  阅读(202)  评论(0编辑  收藏  举报