#include<bits/stdc++.h>
#define sort stable_sort
using namespace std;
struct node{
int x,y;
bool operator < (const node &b) const{
return b.x==x?y<b.y:x<b.x;
}
}e[13];
int walk[13],n,tp[13],ans;//walk:虫洞i走到哪里(如果直接出图那么它的儿子则为0),tp:虫洞i与谁配对(走到该位置便直接tp)
bool vis[13][2],flag,plp;//判断当前虫洞是否被走过(两种状态,0为被走到,1为被tp到)
inline void dfs(int u){
if(flag)return;
int o=walk[u];
if(o==0){
plp=1;
return;
}
if(vis[o][0]){
flag=1;
return;
}
vis[o][0]=1;
int p=tp[o];
if(vis[p][1]){
flag=1;
return;
}
vis[p][1]=1;
if(flag||plp)return;
dfs(p);
}
void solved(){
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
flag=0,plp=0;
vis[i][1]=1;
dfs(i);
if(flag&&!plp){
ans++;
return;
}
}
}
inline void make(int k){
if(k==n+1){
// for(int i=1;i<=n;i++)printf("%d ",tp[i]);
// printf("\n");
// int tmp=ans;
solved();
// if(tmp<ans){
// for(int i=1;i<=n;i++)printf("%d ",tp[i]);
// printf("\n");
// }
return;
}
if(!tp[k])
for(int i=k+1;i<=n;i++){
if(!tp[i]){
tp[k]=i,tp[i]=k;
make(k+1);
tp[k]=tp[i]=0;
}
}
if(tp[k]!=0)make(k+1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&e[i].x,&e[i].y);
sort(e+1,e+n+1);
int j=1;
while(j<=n){
int tp=e[j].x;
int i=j+1;
while(e[i].x==tp){
walk[i-1]=i;
i++;
}
j=i;
}
// for(int i=1;i<=n;i++)printf("%d %d\n",e[i].x,e[i].y);
// for(int i=1;i<=n;i++)printf("%d ",walk[i]);
// printf("\n");
make(1);
printf("%d",ans);
return 0;
}
12
5138254 91583927
607865472 167507876
51248250 8250417
675467597 611809280
157130071 946061365
138261433 967068106
769112165 966993974
675467597 144175980
769112165 475105594
51248250 144175980
947874168 111530133
164921238 967068106
1890
程序输出:2835