构造+DFS
很容易的可以构造两个,最后一个不会构造的话 DFS一下就可以了
#include<iostream> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<iomanip> #include<algorithm> #include<map> using namespace std; int n; int G[205][205]; int flag[205]; int ans[205]; int TOT,FF; void dfs(int now) { if(now==2*n+1) { for(int i=1; i<=2*n; i++) printf("%d ",ans[i]); FF=1; return; } if(now==1) { for(int i=1; i<=2*n; i++) { if(!flag[i]) { flag[i]=1; ans[now]=i; dfs(now+1); if(FF) return; flag[i]=0; } } } else if(now>=2&&now<=n+1) { for(int i=1; i<=2*n; i++) { if(!flag[i]&&!G[i][ans[now-1]]) { flag[i]=1; ans[now]=i; dfs(now+1); if(FF) return; flag[i]=0; } } } else if(now>=n+2&&now<=2*n) { for(int i=1; i<=2*n; i++) { if(!flag[i]&&!G[i][ans[now-n]]) { flag[i]=1; ans[now]=i; dfs(now+1); if(FF) return; flag[i]=0; } } } } int main( ) { freopen("embedding.in","r",stdin); freopen("embedding.out","w",stdout); while(~scanf("%d",&n)) { if(n==0) break; TOT=1; for(int i=1; i<=2*n; i++) ans[TOT]=i,TOT++; TOT--; for(int i=1; i<=TOT; i++) printf("%d ",ans[i]); printf("\n"); for(int i=1; i<=n; i++) G[ans[i]][ans[i+1]]=1,G[ans[i+1]][ans[i]]=1; for(int i=2; i<=n; i++) G[ans[i]][ans[i+n]]=1,G[ans[i+n]][ans[i]]=1; TOT=1; ans[TOT]=1; TOT++; for(int i=n+2; i<=2*n; i++) ans[TOT]=i,TOT++; ans[TOT]=n+1; TOT++; ans[TOT]=n; TOT++; for(int i=2; i<=n-1; i++) ans[TOT]=i,TOT++; TOT--; for(int i=1; i<=TOT; i++) printf("%d ",ans[i]); printf("\n"); for(int i=1; i<=n; i++) G[ans[i]][ans[i+1]]=1,G[ans[i+1]][ans[i]]=1; for(int i=2; i<=n; i++) G[ans[i]][ans[i+n]]=1,G[ans[i+n]][ans[i]]=1; FF=0; memset(flag,0,sizeof flag); dfs(1); } return 0; }
时间: 2024-10-08 00:00:53