USACO 1.3-Wormholes

此题 copy 别人的,题意都木有读的很懂。这样是不好滴,知识习惯性的更新一下 blog,以后减少这样的行为。代码粘一下,看看别人的代码吧。
/*
ID: m1590291
TASK: wormhole
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;

struct Node{
	int x,y,vis,l;
	bool operator <(const Node &rhs)const{
		return x<rhs.x;
	}
};

int n,ans=0,x[20],y[20],x3[20],y3[20],r[20],label[20],cur=0,flag;
vector<Node> g[20];
bool cmp(int ii,int jj){return y[ii]<y[jj];}

void isloop(int y,int x){
	int lx=x,ly=y;
	while(lx<g[ly].size()){
		if(g[ly][lx].vis) {
			flag=1;
			return;
		}
		g[ly][lx].vis=1;
		int t1=g[ly][lx].l;
		lx=x3[label[t1]],ly=y3[label[t1]];
		lx++;

	}
}

bool check(){
	for(int i=0;i<=cur;i++)
		for(int j=0;j<g[i].size();j++)
			g[i][j].vis=0;
	flag=0;
	for(int i=0;i<=cur;i++)
		for(int j=0;j<g[i].size();j++){

			for(int n=0;n<=cur;n++)
				for(int m=0;m<g[n].size();m++)
					g[n][m].vis=0;

				isloop(i,j);

		}
	if(flag) return true;
	else return false;
}

void solve(int c){
	if(c>n/2){
		if(check()) ans++;
		return;
	}
	int pos;
	for(int i=0;i<n;i++)
		if(label[i]<0){
			pos=i;
			break;
		}
	for(int i=pos+1;i<n;i++)
		if(label[i]<0){
			label[i]=pos;
			label[pos]=i;
			solve(c+1);
			label[i]=-1;
		}
	label[pos]=-1;
}

int main(){
	freopen("wormhole.in","r",stdin);
	freopen("wormhole.out","w",stdout);
	cin>>n;
	for(int i=0;i<n;i++) cin>>x[i]>>y[i];
	for(int i=0;i<n;i++) r[i]=i;
	sort(r,r+n,cmp);
	g[0].push_back((Node){x[r[0]],y[r[0]],0,r[0]});
	for(int i=1;i<n;i++){
		int l1=r[i],l2=r[i-1];
		if(y[l1]==y[l2]) g[cur].push_back((Node){x[l1],y[l1],0,l1});
		else g[++cur].push_back((Node){x[l1],y[l1],0,l1});
	}
	for(int i=0;i<n;i++) sort(g[i].begin(),g[i].end());
	for(int i=0;i<=cur;i++)
		for(int j=0;j<g[i].size();j++){
			int t1=g[i][j].l;
			x3[t1]=j;y3[t1]=i;
		}
	memset(label,-1,sizeof(label));
	solve(1);
	cout<<ans<<endl;

	return 0;
}

你可能感兴趣的:(USACO 1.3-Wormholes)