Wormholes

Farmer John's hobby of conducting high-energy physics experiments on weekends has backfired, causing N wormholes (2 <= N <= 12, N even) to materialize on his farm, each located at a distinct point on the 2D map of his farm (the x,y coordinates are both integers).

According to his calculations, Farmer John knows that his wormholes will form N/2 connected pairs. For example, if wormholes A and B are connected as a pair, then any object entering wormhole A will exit wormhole B moving in the same direction, and any object entering wormhole B will similarly exit from wormhole A moving in the same direction. This can have rather unpleasant consequences.

For example, suppose there are two paired wormholes A at (1,1) and B at (3,1), and that Bessie the cow starts from position (2,1) moving in the +x direction. Bessie will enter wormhole B [at (3,1)], exit from A [at (1,1)], then enter B again, and so on, getting trapped in an infinite cycle!

   | . . . .
| A > B . Bessie will travel to B then
+ . . . . A then across to B again

Farmer John knows the exact location of each wormhole on his farm. He knows that Bessie the cow always walks in the +x direction, although he does not remember where Bessie is currently located.

Please help Farmer John count the number of distinct pairings of the wormholes such that Bessie could possibly get trapped in an infinite cycle if she starts from an unlucky position. FJ doesn't know which wormhole pairs with any other wormhole, so find all the possibilities.

PROGRAM NAME: wormhole

INPUT FORMAT:

Line 1: The number of wormholes, N.
Lines 2..1+N: Each line contains two space-separated integers describing the (x,y) coordinates of a single wormhole. Each coordinate is in the range 0..1,000,000,000.

SAMPLE INPUT (file wormhole.in):

4
0 0
1 0
1 1
0 1

INPUT DETAILS:

There are 4 wormholes, forming the corners of a square.

OUTPUT FORMAT:

Line 1: The number of distinct pairings of wormholes such that Bessie could conceivably get stuck in a cycle walking from some starting point in the +x direction.

SAMPLE OUTPUT (file wormhole.out):

2

OUTPUT DETAILS:

If we number the wormholes 1..4 as we read them from the input, then if wormhole 1 pairs with wormhole 2 and wormhole 3 pairs with wormhole 4, Bessie can get stuck if she starts anywhere between (0,0) and (1,0) or between (0,1) and (1,1).

   | . . . .
4 3 . . . Bessie will travel to B then
1-2-.-.-. A then across to B again

Similarly, with the same starting points, Bessie can get stuck in a cycle if the pairings are 1-3 and 2-4 (if Bessie enters WH#3 and comes out at WH#1, she then walks to WH#2 which transports here to WH#4 which directs her towards WH#3 again for a cycle).

Only the pairings 1-4 and 2-3 allow Bessie to walk in the +x direction from any point in the 2D plane with no danger of cycling.

————————————————————————————题解

为了提醒一下自己错了那么傻【哔——】的一个错误

题目大意是一个奇怪的农夫炸出了许多黑洞【他怎么办到的……】黑洞两两联通,假如1,2黑洞是一对,从1黑洞进去会从2黑洞出来,从2黑洞进去会从1黑洞出来,然后他蠢得要死的奶牛不会躲,而且傻乎乎地往x正半轴的方向走,他的奶牛可能进入死循环,然后就gg了……然后这个炸出黑洞的人并不知道哪两个黑洞联通,我们要计算这些黑洞会在任意一点出现死循环的配对数

我们离散化一下,然后暴力搭配,然后在任意一个黑洞模拟走路就可以了,就是最后一个模拟没写好,挂了三次……

 /*
PROB: wormhole
LANG: C++
ID: jiaqi si
*/
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#define ivory
#define mo 1000000007
#define siji(i,x,y) for(int i=(x);i<=(y);i++)
#define gongzi(j,x,y) for(int j=(x);j>=(y);j--)
#define xiaosiji(i,x,y) for(int i=(x);i<(y);i++)
#define sigongzi(j,x,y) for(int j=(x);j>(y);j--)
#define pii pair<int,int>
#define fi first
#define se second
#define mo 1000000007
using namespace std;
pii a[];
int n,pline[];
int paring[],now;
bool use[];
vector<int> v[];
int ans;
bool check(int k,int prev) {
if(prev!=paring[k]) { return check(paring[k],k);}
//只要它过黑洞的时候不走回去就行,之前打了标记,然而有些时候黑洞可以走两次
else {
int s=v[pline[k]].size();
xiaosiji(i,,s) {
if(a[v[pline[k]][i]].fi==a[k].fi) {
if(i==s-) return true;
if(v[pline[k]][i+]==now) return false;
return check(v[pline[k]][i+],k);
break;
}
}
}
return true;
}
void calculate() {
siji(i,,n) {
now=i;
if(!check(i,)) {++ans;return;}
} }
void dfs(int u,int t) {
if(t==n-) {
siji(i,,n) if(!use[i]) {paring[u]=i;paring[i]=u;}
calculate();return;
}
use[u]=;
siji(i,,n) {
if(!use[i]) {
use[i]=;paring[i]=u;paring[u]=i;
siji(j,,n) {
if(!use[j]) {dfs(j,t+);break;}
}
use[i]=;
}
}
use[u]=;
}
int main()
{
#ifdef ivory
freopen("wormhole.in","r",stdin);
freopen("wormhole.out","w",stdout);
#else
freopen("f1.in","r",stdin);
#endif
scanf("%d",&n);
siji(i,,n) {
scanf("%d%d",&a[i].fi,&a[i].se);
swap(a[i].fi,a[i].se);
}
sort(a+,a+n+);
int it=a[].fi,cnt=;
siji(i,,n) {
if(a[i].fi==it) {v[cnt].push_back(i);pline[i]=cnt;}
else {it=a[i].fi;++cnt;v[cnt].push_back(i);pline[i]=cnt;}
swap(a[i].fi,a[i].se);
}
dfs(,);
printf("%d\n",ans);
return ;
}

USACO 1.3 Wormholes的更多相关文章

  1. [题解]USACO 1.3 Wormholes

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  2. USACO 1.3 Wormholes - 搜索

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  3. USACO Section1.3 Wormholes 解题报告

    wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------- ...

  4. USACO Wormholes 【DFS】

    描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他的虫洞将形成 N/2 ...

  5. USACO Section 1.3 Wormholes 解题报告

    题目 题目描述 在一个二维平面上有N个点,这N个点是(N/2)个虫洞的端点,虫洞的特点就是,你以什么状态从某个端点进去,就一定会以什么状态从另一端的端点出来.现在有一头牛总是沿着与X轴正方向平行的直线 ...

  6. 【USACO 1.3】Wormholes

    /* LANG: C++ TASK: wormhole n个洞,n<=12, 如果两洞配对,则它们之间有地下路径(无向) 牛在地上只会往+x方向 问多少种两两配对的方案,牛从地上某位置出发,会陷 ...

  7. 「日常训练」「小专题·USACO」 Wormholes(1-4)

    题意 之后补充. 分析 这是一条很好的考察递归(或者说搜索)的题目.它的两个过程(建立初步解,验证)都用到了递归(或者说运用递归可以相当程度的减少代码量). 具体实现见代码.注意,为了使用std::p ...

  8. 【USACO】wormholes 【暴力】

    题意:给出2K个平面上的点,给它们一一配对,问有多少种配对方法使得存在从某个点一直向右走会陷在循环里(K<=6) 思路:由于k很小,配对方法的话暴力枚举,然后判环,判环时需要注意的是一条直线上的 ...

  9. POJ 3259 Wormholes (判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...

随机推荐

  1. [ios2] 开发技巧【转】

    1.NSCalendar用法 -(NSString *) getWeek:(NSDate *)d { NSCalendar *calendar = [[NSCalendar alloc] initWi ...

  2. 办理布鲁克大学(本科)学历认证『微信171922772』Brock学位证成绩单使馆认证Brock University

    办理布鲁克大学(本科)学历认证『微信171922772』Brock学位证成绩单使馆认证Brock University [寻-求-当-地-合-作-代-理-人-员] 丨Q微-1719-22772丨學丨历 ...

  3. 【Backbone】 Backbone初探

    前言 在此之前研究了一段React,但是不得不承认React.Vue等MVVM框架相对于原有的Jquery来说,简直是翻天覆地的不同.它们之间的差异不仅仅体现在框架思维的不同,而是ES5到ES6的编程 ...

  4. Socket编程中的长连接、短链接以及心跳包机制详解

    参考:http://blog.csdn.net/zdwzzu2006/article/details/7723738 一.定义 1.TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...

  5. java zip 批量打包(java.util包和apache.tools包)

    /** * 文件批量打包 * @param zipPath 打包路径 * @param files 批量文件 */ public void zipOut(String zipPath,File[] f ...

  6. gimagex 2.0.17 汉化版

    软件名称: gimagex 2.0.17 汉化版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 1.31MB 图片预览: 软件简介: gimagex 2. ...

  7. WebForm 分页与组合查询

    1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> ...

  8. FZU 2240 Daxia & Suneast's problem

    博弈,$SG$函数,规律,线段树. 这个问题套路很明显,先找求出$SG$函数值是多少,然后异或起来,如果是$0$就后手赢,否则先手赢.修改操作和区间查询的话可以用线段树维护一下区间异或和. 数据那么大 ...

  9. ps遇到的问题及笔记

    1. ps软件图层面板中不显示缩略图 打开软件后,任意打开一个文件,再打开图层面板(直接按F7也可),点图层面板右上角的小三角后有一个新的面板出现,点下面的"面板选项"弹出一个面板 ...

  10. 使用rsync无密码传输

    众多数据库服务器的管理过程中,在不同服务器间的文件传输是免不了的.您可以使用scp命令或FTP方法完成文件的发送和接收,这篇文章我将给大家介绍另外一种方法,这就是rsync命令.rsync是文件传输程 ...