usaco 1.3.7wormhole

描述

農夫約翰愛好在週末進行高能物理實驗的結果卻適得其反,導致N個蟲洞在農場上(2<=N<=12,n是偶數),每個在農場二維地圖的一個不同點。

根據他的計算,約翰知道他的蟲洞將形成 N/2 連接配對。例如,如果A和B的蟲洞連接成一對,進入蟲洞A的任何對象體將從蟲洞B出去,朝着同一個方向,而且進入蟲洞B的任何對象將同樣從蟲洞A出去,朝着相同的方向前進。這可能發生相當令人不快的後果。

例如,假設有兩個成對的蟲洞A(1,1) 和 B(3,1),貝茜從(2,1)開始朝着 +x 方向(右)的位置移動。貝茜將進入蟲洞 B(在(3,1)),從A出去(在(1,1)),然後再次進入B,困在一個無限循環中!

| . . . .
| A > B .      貝茜會穿過B,A,
+ . . . .      然後再次穿過B

農夫約翰知道他的農場裏每個蟲洞的確切位置。他知道貝茜總是向 +x 方向走進來,雖然他不記得貝茜的當前位置。請幫助農夫約翰計算不同的蟲洞配對(情況),使貝茜可能被困在一個無限循環中,如果她從不幸的位置開始。

[編輯]格式

PROGRAM NAME: wormhole

INPUT FORMAT:

  (file wormhole.in)

第1行:N,蟲洞的數目

第2到N+1行:每一行都包含兩個空格分隔的整數,描述一個以(x,y)爲座標的單一的蟲洞。每個座標是在範圍 0..1000000000。

OUTPUT FORMAT:

(file wormhole.out)

第1行:會使貝茜從某個起始點出發沿+x方向移動卡在循環中的不同的配對數。

[編輯]SAMPLE INPUT

4
0 0
1 0
1 1
0 1

有4個蟲洞,在一個正方形角上。

[編輯]SAMPLE OUTPUT

2

如果我們將蟲洞編號爲1到4,然後通過匹配 1 與 2 和 3 與 4,貝茜會被卡住,如果她從(0,0)到(1,0)之間的任意位置開始或(0,1)和(1,1)之間。

| . . . .
4 3 . . .      貝茜會穿過B,A,
1-2-.-.-.      然後再次穿過B

相似的,在相同的起始點,如果配對是 1-3 和 2-4,貝茜也會陷入循環。(如果貝西從3進去,1出來,她會走向2,然後被傳送到4,最後又回到3)

僅有1-4和2-3的配對允許貝茜從任何二維平面上的點向+x方向走不出現循環。


爆搜:

/*
	ID: thy47021
	PROG:wormhole
	LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int n;
struct aaaa{
	int x,y;
}s[20];
bool cmp(aaaa a,aaaa b){
	if(a.y==b.y){
		return a.x<b.x;
	}
	return a.y<b.y;
}
int map[20][20];
int ans;
bool vis[20][4];
bool isok(int x,int last,int edge){
	if(x==n+1)return false;
	if(last==0){memset(vis,0,sizeof(vis));vis[x][edge+1]=true;}
	for(int i=1;i<=n;i++){
		if(i==last)continue;
		if(map[x][i]==2)return true;
		if(map[x][i]==edge){
			if(vis[i][-edge+1])return true;
			vis[i][-edge+1]=true;
			if(isok(i,x,-edge))return true;
		    vis[i][-edge+1]=false;
		}
	}
	return false;
}
bool ispei[20];
void dfs(int x){
	if(x==n+1){
		for(int i=1;i<=n;i++){
			if(isok(i,0,-1)){ans++;return ;}
		}
		return ;
	}
	if(ispei[x])dfs(x+1);
	else {
		ispei[x]=true;
	    for(int i=1;i<=n;i++){
		    if(!ispei[i]){
			    if(map[x][i])map[x][i]++;
				else map[x][i]=-1;
			    if(map[i][x])map[i][x]++;
				else map[i][x]=-1;
		    	ispei[i]=true;
		    	dfs(x+1);
	    		if(map[x][i]==-1)map[x][i]=0;
				else map[x][i]--;
				if(map[i][x]==-1)map[i][x]=0;
				else map[i][x]--;
	    		ispei[i]=false;
		    }
		}
	    ispei[x]=false;
	}
}
int main(){
	freopen("wormhole.in","r",stdin);
	freopen("wormhole.out","w",stdout);
    cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i].x>>s[i].y;
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<n;i++){
		if(s[i+1].y==s[i].y)map[i][i+1]=1;
	}
	dfs(1);
	cout<<ans<<endl;

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章