HDU 2181 哈密顿绕行世界问题

    xiaoxiao2022-07-06  192

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

    搜索,深度优先

    #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <queue> #include <cmath> using namespace std; int x[21][3]={0},num,ans[21]={0},lu[21]={0},keyy; int f(int n,int key) { if(n==20&&ans[keyy]==0) { printf("%d: ",num++); int i; for(i=0;i<20;i++) printf("%d ",lu[i]); printf("%d",keyy); printf("\n"); return 0; } ans[key]=1;lu[n]=key; if(ans[x[key][0]]==0) f(n+1,x[key][0]); if(ans[x[key][1]]==0) f(n+1,x[key][1]); if(ans[x[key][2]]==0) f(n+1,x[key][2]); ans[key]=0;lu[n]=0; return 0; } int main() { int i,j,key; for(i=1;i<=20;i++) { scanf("%d",&x[i][0]); scanf("%d",&x[i][1]); scanf("%d",&x[i][2]); } while(1) { num=1; ans[0]=0;ans[1]=0;ans[2]=0;ans[3]=0;ans[4]=0; ans[5]=0;ans[6]=0;ans[7]=0;ans[8]=0;ans[9]=0; ans[10]=0;ans[11]=0;ans[12]=0;ans[13]=0;ans[14]=0; ans[15]=0;ans[16]=0;ans[17]=0;ans[18]=0;ans[19]=0;ans[20]=0; scanf("%d",&key); if(key==0) break; lu[0]=key; keyy=key; f(1,x[key][0]); f(1,x[key][1]); f(1,x[key][2]); } return 0; }

    搜索 用数组存储走过的路,走过的标记并不再走,若步数达到20布即已经走遍所有,打印。 第一个与最后一个题目已经给出。

    最新回复(0)