代码求调,附样例
查看原帖
代码求调,附样例
537184
BeMissJRsdog楼主2022/8/20 16:25
#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

2022/8/20 16:25
加载中...