这道题就是去考虑一下虫洞的配对是否能成为一个环。先是要将虫洞右边最近的一个虫洞找到,保存在nextr数组中,接着去配对虫洞,先配对,配完了之后再去判断能否成为环。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct point{
long long x,y;
}p[15];
int nextr[15],par[15],N=0;
int exist(){
int start=0,i=0,posi=0;
for (start=1;start<=N;start++){
posi=start;
for (i=1;i<=N;i++){
posi=par[nextr[posi]];
}
if (posi!=0){
return 1;
}
}
return 0;
}
int whsolve(){
int i=0,j=0,tot=0;
for (i=1;i<=N;i++){
if (par[i]==0){
break;
}
}
if (i>N){
return exist();
}
for (j=i+1;j<=N;j++){
if (par[j]==0){
par[i]=j;
par[j]=i;
tot+=whsolve();
par[i]=0;
par[j]=0;
}
}
return tot;
}
int main (){
freopen ("wormhole.in","r",stdin);
freopen ("wormhole.out","w",stdout);
int i=0,j=0;
cin>>N;
for (i=1;i<=N;i++){
cin>>p[i].x>>p[i].y;
}
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
if (p[j].x>p[i].x&&p[j].y==p[i].y){
if (nextr[i]==0||(p[j].x-p[i].x)<(p[nextr[i]].x-p[i].x)){
nextr[i]=j;
}
}
}
}
cout<<whsolve()<<endl;
return 0;
}