杭电2181--哈密顿绕行世界问题(Dfs)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2181

好像很久没有刷题了, 真的是手生到不要不要的, 这道应该很明显就是Dfs, 然而我第一眼看上去竟然没有什么感觉, 还是看题解解出来的。 看来以后每天要至少A道题保持手感了。

//这个比较好理解, 算是一种比较常规的写法了;
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[21][21], dis[21], vis[21], ge, num, m, Q;
void Dfs(int x)
{
    int k;
    dis[num++] = x;             //标记开始节点;
    vis[x] = 1;
    if(num == 20 && map[x][m])  //回到开始城市;
    {
        printf("%d:  ", ++Q);

        for(int i = 0; i < 20; i++)
            printf("%d ", dis[i]);
        printf("%d", m);
        printf("\n");
    }
    for(int k = 1; k <= 20; k++)
    {
        if(!vis[k] && map[x][k])
        {
            Dfs(k);
            vis[k] = 0;
            num--;
        }
    }}
int main()
{
    int a, b, c, i, j, t;
    for(int i = 1; i <= 20; i++)
    {
        for(int j = 1; j <= 3; j++)
        {
            scanf("%d", &t);
            map[i][t] = 1;
        }
    }
    while(~scanf("%d", &m), m)
    {
        Q = 0; num = 0;
        memset(vis, 0, sizeof(vis));
        memset(dis, 0, sizeof(dis));
        Dfs(m);
    }
    return 0;
}

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[21][3], dis[21], vis[21], Q;
void Dfs(int a, int n, int A)
{
    dis[n] = a;
    vis[a] = 1;
    int i, j;
    for(int i = 0; i < 3; i++)
    {
        int s = map[a][i];
        if(n == 19 && s == A)
        {
            printf("%d:  ", ++Q);
            for(int j = 0; j < 20; j++)
                printf("%d ", dis[j]);
            printf("%d\n", A);
        }
        if(!vis[s])
            Dfs(s, n + 1, A);
    }
    vis[a] = 0;
}
int main()
{
    for(int i = 1; i <= 20; i++)
        scanf("%d %d %d", &map[i][0], &map[i][1], &map[i][2]);
    int M;
    while(~scanf("%d", &M), M)
    {
        Q = 0;
        memset(vis, 0, sizeof(vis));
        Dfs(M, 0, M);
    }
    return 0;
}

简洁写法

时间: 2024-10-12 12:39:26

杭电2181--哈密顿绕行世界问题(Dfs)的相关文章

HDU ACM 2181 哈密顿绕行世界问题-&gt;DFS(深度有限搜索)

分析:DFS即可. #include<iostream> using namespace std; bool map[21][21]; bool vis[21]; int ans[21],num,m; void init() { int i,a; memset(map,false,sizeof(map)); for(i=1;i<=20;i++) //构图 { map[i][cin>>a,a]=true; map[i][cin>>a,a]=true; map[i][

HDU 哈密顿绕行世界问题 (dfs)

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

HDOJ 题目2181 哈密顿绕行世界问题(DFS)

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1517    Accepted Submission(s): 967 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数

DFS HDOJ 2181 哈密顿绕行世界问题

题目传送门 题意:中文题面 分析:直接排完序后DFS.这样的题以后不应该再写题解的. #include <bits/stdc++.h> using namespace std; vector<int> G[21]; int ans[21]; int v[3]; bool vis[21]; int cnt; void print() { printf ("%d: ", ++cnt); for (int i=0; i<20; ++i) { printf (&q

HDU 2181 哈密顿绕行世界问题【DFS】

题意:给出一个十二面体,它的每个顶点是一个城市,从一个城市m出发并回到m,输出所有可行的路径 先把边记录下来,再深搜 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set>

HDU 2181 哈密顿绕行世界问题 (dfs)

Sample Input 2 5 20 1 3 12 2 4 10 3 5 8 1 4 6 5 7 19 6 8 17 4 7 9 8 10 16 3 9 11 10 12 15 2 11 13 12 14 20 13 15 18 11 14 16 9 15 17 7 16 18 14 17 19 6 18 20 1 13 19 5 0 Sample Output 1 #include <iostream> 2 3 using namespace std; 4 5 int Map[21][21

HDU 2181 哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

哈密顿绕行世界问题(dfs+记录路径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2362    Accepted Submission(s): 1490 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的

HDU - 2181 C - 哈密顿绕行世界问题(DFS

题目传送门 C - 哈密顿绕行世界问题 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output