题意:
给出n个虫洞,问有多少种配对使从某一列第一行出发会陷入环。
暴力配对暴力走。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct node{int x,y;}a[20];
int b[20],visit[20];
int n,ans=0;
bool cmp(node pp,node qq){return pp.y==qq.y?pp.x<qq.x:pp.y<qq.y;}
int walk(int xx,int yy)
{
for (int i=0;i<n;i++)
if (a[i].y==yy && a[i].x>xx)
{
if (!visit[i])
{visit[i]=1;return walk(a[b[i]].x,a[b[i]].y);}
else
return 1;
break;
}
return 0;
}
void pei(int o)
{
if (o==n-1)
{
for (int i=0;i<n;i++)
{
memset(visit,0,sizeof(visit));
visit[i]=1;
if (walk(a[b[i]].x,a[b[i]].y))
{
ans++;
break;
}
}
return;
}
if (b[o]==-1)
{
for (int j=o+1;j<n;j++)
{
if (b[j]==-1)
{
b[o]=j;b[j]=o;
pei(o+1);
b[o]=-1;b[j]=-1;
}
}
}
else pei(o+1);
}
int main()
{
scanf("%d",&n);
memset(b,-1,sizeof(b));
for (int i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
pei(0);
printf("%d\n",ans);
return 0;
}