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

只有20个城市,而且每个点的度数恰好是3,也就意味着,对于即将进入环中的点,入度1,出度2,下一个点只有两种可能

暴力枚举出所有的路径,也不过3*2^18,之后对于每个点作为起点的情况分别调整即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int e[21][3];
bool vis[21];
struct circle{
int a[20];
circle(){}
circle(int b[20]){
for(int i=0;i<20;i++)a[i]=b[i];
}
bool operator <(circle c2)const {//便于按字典序排序
for(int i=0;i<20;i++){
if(a[i]<c2.a[i])return true;
else if(a[i]>c2.a[i])return false;
}
return false;
}
void rot(int m){//调整成以m为起点
int ind=0;
for(;ind<20&&a[ind]!=m;ind++){}
int b[20];
for(int i=0;i<20;i++){
b[i]=a[(i+ind)%20];
}
for(int i=0;i<20;i++){
a[i]=b[i];
}
}
}c[100000];
int cnum;
int heap[20];
void dfs(int s,int f,int cnt){
vis[s]=true;
heap[cnt-1]=s;
if(cnt==20){
for(int i=0;i<3;i++){
if(e[s][i]==f){
c[cnum++]=circle(heap);
}
}
vis[s]=false;
return ;
}
for(int i=0;i<3;i++){
if(!vis[e[s][i]]){
dfs(e[s][i],f,cnt+1);
}
}
vis[s]=false;
}
int main(){
int m;
for(int i=1;i<=20;i++){
for(int j=0;j<3;j++){
scanf("%d",e[i]+j);
}
}
dfs(1,1,1);
while(scanf("%d",&m)==1&&m!=0){
for(int i=0;i<cnum;i++){
c[i].rot(m);
}
sort(c,c+cnum);
for(int i=0;i<cnum;i++){
printf("%d: ",i+1);
for(int j=0;j<20;j++){
printf("%d ",c[i].a[j]);
}
printf("%d\n",m);
}
}
return 0;
}

HDU 2181 哈密顿绕行世界问题 dfs 难度:1的更多相关文章

  1. HDU 2181 哈密顿绕行世界问题 (DFS)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. HDU - 2181 哈密顿绕行世界问题 dfs图的遍历

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. (step4.3.8)hdu 2181(哈密顿绕行世界问题——DFS)

    题目大意:通俗点讲就是,输出所有从m城市出发,便利所有城市之后又能回到m城市的序列...... 解题思路:DFS 1)用map[][]来存储城市之间的连通情况.用used[]存储某个城市的使用情况(即 ...

  4. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. hdu 2181 哈密顿绕行世界问题【DFS】

    题目链接 题目大意: Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市.    Input ...

  6. HDU 2181 哈密顿绕行世界问题(DFS)

    Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...

  7. HDU 2181 哈密顿绕行世界问题 (DFS)

    题目链接:https://vjudge.net/contest/185350#problem/C 题目大意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城 ...

  8. HDU 2181 哈密顿绕行世界问题

    Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...

  9. HDU2181 哈密顿绕行世界问题 —— DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...

随机推荐

  1. hdu5816 卡特兰数+dp

    题意:共n张无中生有,m张攻击牌.每张攻击牌攻击力已知,敌方有p点血.随机洗牌.游戏开始,己方抽取一张手牌,若是无中生有则可再抽两张牌.求能在第一回合内将敌方杀死的概率. n+m <= 20, ...

  2. HDU4801·二阶魔方

    题意:给定二阶魔方初始状态,问N(1 <= N <= 7)步旋转操作以内最多能使几个面相同. dfs搜索+剪枝. 魔方的每个旋转操作即对应于一个置换操作.又因为相对运动,上层左旋一次和下层 ...

  3. linux特殊字符

    linux特殊字符: * 匹配文件名中的任何字符串,包括空字符串. ? 匹配文件名中的任何单个字符. [...] 匹配[ ]中所包含的任何字符. [!...] 匹配[ ]中非感叹号!之后的字符. 当s ...

  4. C#_拆箱跟装箱

    Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上.那么如果要把一个值类型数据放到堆上,就需要装箱操作:反之,把一个放在堆上的 ...

  5. python网络编程socket之多线程

    #coding:utf-8 __author__ = 'similarface' import os,socket,threading,SocketServer SERVER_HOST='localh ...

  6. listview去掉底部多出的边框黑色

    listview去掉底部多出的边框黑色 android:fadingEdge="none" //去掉listview黑色底边 listview.setDivider(null);

  7. android 属性

    RelativeLayout 第一类:属性值为true可false android:layout_centerHrizontal        水平居中 android:layout_centerVe ...

  8. 在应用中更新App版本

    在应用中, 为了提高用户体验, 会提供更新版本的功能. 那么如何实现呢? 我写了一个简单的Demo, 说明一下, 需要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...

  9. ScrollVIew 边界阴影效果

    一.删除android ScrollView边界阴影方法方法 1) 在xml中添加:android:fadingEdge=”none” 2) 代码中添加:ScrollView.setHorizonta ...

  10. SAP 物料主数据屏幕增强

    1. 用事务代码OMT3C,(或者用SPRO进入,后勤-常规->物料主记录->配置物料主记录->创建定制子屏幕的程序)创建函数功能组,如ZMGD1,然后保存. 2. 用事务代码SE8 ...