HDU2181 哈密顿绕行世界问题

解题思路:哈密顿环游世界问题。一道简单的题目,用回溯。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 24;
 6 int vis[maxn], mapp[maxn][maxn], path[maxn];
 7 int m, x, kase = 1;
 8
 9 void Print()
10 {
11     printf("%d:  ", kase ++); //两个空格
12     for(int i = 1; i <= 20; i++)
13     {
14         printf("%d ", path[i]);
15     }
16     printf("%d\n", m);
17     return ;
18 }
19
20 //now为当前城市,num为已有的城市个数
21 void DFS(int now, int num)
22 {
23     path[num] = now;
24     vis[now] = 1; //now标记为已经访问过
25     if(num == 20) //表示已经有20个城市
26     {
27         //如果第20个城市与m相连,则打印出来
28         if(mapp[now][m]) Print();
29     }
30     else
31     {
32         for(int i = 1; i <= 20; i++)
33         {
34             //如果这个城市没有访问过,并且与now相连,继续搜
35             if(!vis[i] && mapp[now][i]) DFS(i, num+1);
36         }
37     }
38     vis[now] = 0; //回溯
39     return ;
40 }
41
42 int main()
43 {
44     memset(vis, 0, sizeof(vis));
45     memset(mapp, 0, sizeof(mapp));
46     for(int i = 1; i <= 20; i++)
47     {
48         for(int j = 1; j <= 3; j++)
49         {
50             scanf("%d", &x);
51             mapp[i][x] = mapp[x][i] = 1;
52         }
53     }
54     while(~scanf("%d", &m) && m)
55     {
56         DFS(m, 1);
57     }
58     return 0;
59 }

时间: 2024-12-11 06:01:45

HDU2181 哈密顿绕行世界问题的相关文章

hdu2181 哈密顿绕行世界问题 哈密顿图。。水题

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

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

哈密顿绕行世界问题

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个顶点标出世界著名的

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个数

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

哈密顿绕行世界问题---hdu2181(全排列问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 题意很容易理解,dfs就可以了 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stdlib.h> #include <queue> #include <map> #include <

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