zoukankan      html  css  js  c++  java
  • HDU 2181 哈密顿绕行世界问题 (DFS)

    题目链接:https://vjudge.net/contest/185350#problem/C

    题目大意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。输出从第m个城市出发经过每个城市1次又回到m的所有路线, 如有多个解,按字典序从小到大输出。

    解题思路:题目很吓人,从起点DFS,重新回到起点是把路径输出来就行了,注意:下一个走的点要按从小到大的顺序,因为要使路径字典序从小到大。

    代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 
     7 int point,cnt; 
     8 int map[25][25];
     9 int vis[25],path[25];
    10 
    11 void dfs(int pos,int len){
    12     vis[pos]=1;
    13     //下个点按从小到大顺序走 
    14     for(int i=1;i<=20;i++){
    15         if(map[pos][i]){
    16             path[len]=pos;
    17             if(i==point&&len==20){
    18                 printf("%d:  ",++cnt);
    19                 for(int i=1;i<=20;i++)
    20                     printf("%d ",path[i]);
    21                 printf("%d
    ",point);
    22             }
    23             if(!vis[i])
    24                 dfs(i,len+1);        
    25         }
    26     }
    27     vis[pos]=0;
    28 }
    29 
    30 int main(){
    31     int a,b,c;
    32     while(scanf("%d",&a)&&a){
    33         cnt=0;
    34         memset(map,0,sizeof(map));
    35         scanf("%d%d",&b,&c);
    36         map[1][a]=map[1][b]=map[1][c]=1;
    37         for(int i=2;i<=20;i++){
    38             scanf("%d%d%d",&a,&b,&c);
    39             map[i][a]=map[i][b]=map[i][c]=1;
    40         }
    41         scanf("%d",&point);
    42         dfs(point,1);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    wpf 资源
    九宫格扩展,输入一个奇数,得到横竖斜相加相等结果
    安装IIS的convlog.exe问题
    Windows API
    使用快捷键弹出新对话框
    数据结构笔试(转)
    运算符重载
    宽字节与多字节转换
    C++之乱七八糟<真正的随笔>
    MFC调用ActiveX
  • 原文地址:https://www.cnblogs.com/fu3638/p/7531194.html
Copyright © 2011-2022 走看看