描述
農夫約翰愛好在週末進行高能物理實驗的結果卻適得其反,導致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;
}