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 @   Garrett_Wale  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示