此题 copy 别人的,题意都木有读的很懂。这样是不好滴,知识习惯性的更新一下 blog,以后减少这样的行为。代码粘一下,看看别人的代码吧。
/* ID: m1590291 TASK: wormhole LANG: C++ */ #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<vector> #include<cstring> using namespace std; struct Node{ int x,y,vis,l; bool operator <(const Node &rhs)const{ return x<rhs.x; } }; int n,ans=0,x[20],y[20],x3[20],y3[20],r[20],label[20],cur=0,flag; vector<Node> g[20]; bool cmp(int ii,int jj){return y[ii]<y[jj];} void isloop(int y,int x){ int lx=x,ly=y; while(lx<g[ly].size()){ if(g[ly][lx].vis) { flag=1; return; } g[ly][lx].vis=1; int t1=g[ly][lx].l; lx=x3[label[t1]],ly=y3[label[t1]]; lx++; } } bool check(){ for(int i=0;i<=cur;i++) for(int j=0;j<g[i].size();j++) g[i][j].vis=0; flag=0; for(int i=0;i<=cur;i++) for(int j=0;j<g[i].size();j++){ for(int n=0;n<=cur;n++) for(int m=0;m<g[n].size();m++) g[n][m].vis=0; isloop(i,j); } if(flag) return true; else return false; } void solve(int c){ if(c>n/2){ if(check()) ans++; return; } int pos; for(int i=0;i<n;i++) if(label[i]<0){ pos=i; break; } for(int i=pos+1;i<n;i++) if(label[i]<0){ label[i]=pos; label[pos]=i; solve(c+1); label[i]=-1; } label[pos]=-1; } int main(){ freopen("wormhole.in","r",stdin); freopen("wormhole.out","w",stdout); cin>>n; for(int i=0;i<n;i++) cin>>x[i]>>y[i]; for(int i=0;i<n;i++) r[i]=i; sort(r,r+n,cmp); g[0].push_back((Node){x[r[0]],y[r[0]],0,r[0]}); for(int i=1;i<n;i++){ int l1=r[i],l2=r[i-1]; if(y[l1]==y[l2]) g[cur].push_back((Node){x[l1],y[l1],0,l1}); else g[++cur].push_back((Node){x[l1],y[l1],0,l1}); } for(int i=0;i<n;i++) sort(g[i].begin(),g[i].end()); for(int i=0;i<=cur;i++) for(int j=0;j<g[i].size();j++){ int t1=g[i][j].l; x3[t1]=j;y3[t1]=i; } memset(label,-1,sizeof(label)); solve(1); cout<<ans<<endl; return 0; }