[USACO1.3]虫洞wormhole

大意

给定一些点,在横向穿过这些点时将会被传送回纵坐标相同的 y y y轴上,问有多少种情况会使得永远向右爬的虫子陷入死循环


思路

首先因为只会向右爬,所以我们只需将同一行上的点间连边,然后 d f s dfs dfs暴力找匹配,之后判环即可


代码

/*
ID:hzbismy1
LANG:C++
TASK:wormhole
*/
#include
#include
#include
#define x second
#define y first
using namespace std;int n,to[20],pre[20],ans;
bool vis[20];
pair<int,int>p[20];
inline bool check(register int k)//判环
{
	while(to[k])
	{
		if(vis[k]) return true;
		vis[k]=true;
		k=pre[to[k]];
	}
	return false;
}
inline void dfs(register int dep)//暴力找匹配
{
	if(dep>n)
	{
		for(register int i=1;i<=n;i++)
		{
			fill(vis+1,vis+1+n,0);
			if(check(i)){ans++;return;}
		}
		return;
	}
	if(pre[dep]) dfs(dep+1);
	else
	{
		for(register int i=dep+1;i<=n;i++)
		if(!pre[i])
		{
			pre[i]=dep;pre[dep]=i;
			dfs(dep+1);
			pre[i]=0;pre[dep]=0;
		}
	}
}
signed main()
{
	freopen("wormhole.in","r",stdin);
	freopen("wormhole.out","w",stdout);
	scanf("%d",&n);
	for(register int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
	sort(p+1,p+1+n);
	for(register int i=1;i<n;i++) if(p[i].y==p[i+1].y) to[i]=i+1;
	dfs(1);
	printf("%d\n",ans);	//输出
}

你可能感兴趣的:(dfs)