HDU 2181 哈密顿绕行世界问题 dfs 难度:1
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的更多相关文章
- HDU 2181 哈密顿绕行世界问题 (DFS)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU - 2181 哈密顿绕行世界问题 dfs图的遍历
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- (step4.3.8)hdu 2181(哈密顿绕行世界问题——DFS)
题目大意:通俗点讲就是,输出所有从m城市出发,便利所有城市之后又能回到m城市的序列...... 解题思路:DFS 1)用map[][]来存储城市之间的连通情况.用used[]存储某个城市的使用情况(即 ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 2181 哈密顿绕行世界问题【DFS】
题目链接 题目大意: Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input ...
- HDU 2181 哈密顿绕行世界问题(DFS)
Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...
- HDU 2181 哈密顿绕行世界问题 (DFS)
题目链接:https://vjudge.net/contest/185350#problem/C 题目大意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城 ...
- HDU 2181 哈密顿绕行世界问题
Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...
- HDU2181 哈密顿绕行世界问题 —— DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...
随机推荐
- bootstrap学习笔记<六>(表单二之按钮)
按钮(补充) (ps:居中元素可以使用<center></center>标签) 块级按钮(ps:按钮占一整行) <button class="btn btn-p ...
- DDL之操作表
DDL之操作表 DDL是数据定义语言,用来定义数据库对象:数据库.表.列等.其中定义数据库我们已经在DDL之操作数据库中详细讲解了,今天我们来学习使用DDL操作表. 1.创建表 使用数据定义语言创建表 ...
- unique-substrings-in-wraparound-string(好)
https://leetcode.com/problems/unique-substrings-in-wraparound-string/ 好,我自己做出来的.多总结规律,多思考. package c ...
- hdu 2256 好神奇的矩阵!
这题自己一开始硬是不会处理√6 前面的系数,直到看了别人的博客后才知道是怎么解得,不多说,先付上一张图: 推出这个关系后,就很容易了. #include<cstdio> #include& ...
- 网络性能测试工具iperf详细使用图文教程【转载】
原文:http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ 参考:http://man.linuxde.net/iper ...
- iOS开发 UIPanGestureRecognizer手势抽象类
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@sel ...
- 优之星S900平板电脑root方法
优之星S900root方法: 尝试百度一键root安卓的apk版本root失败. 电脑上下载百度一键root的Windows版本,平板设置→开发者选项→允许USB调试√,保持唤醒状态√,安全设置→允许 ...
- 使用Visual Studio制作安装包
目 录 第1章 合并模块 3 1.1 SystemDll 3 1.1.1 收集文件 3 1.1.2 新建项目 4 1.1.3 增加自定义文件夹 4 1.1.4 设置部署位 ...
- 【转】 FPGA设计的四种常用思想与技巧
本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...