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. MyEclipse导入Maven项目pom文件第一行报错,运行Tomcat报Log4j错误--解决方法

    问题描述: 前一段时间电脑第一次导入Maven项目,又是pom文件错,改好后又是运行Tomcat报Log4j错误,一直倒腾了近一个月程序才成功跑起来,太不容易. 也上网查了很长时间,没一个方法能解决我 ...

  2. H5与CS3权威下.18 and 19 选择器(1)

    18章.CSS3概述 1.从前端技术的角度把互联网的发展分为三个阶段: (1)web1.0:HTML和CSS. (2)web2.0:Ajax,Javascript/DOM/异步数据请求. (3)web ...

  3. hibernate-部分字段查询方案

    hibernate的延迟加载与本列记录不一样,延迟加载正常一般用于关联字段,或者大型字段使用. 本列的情况主要用于,某一张表有几十甚至上百个字段,例如财务报表等.但是在使用某些场景是却大多只是用其10 ...

  4. linux面试题集锦4《转》

    四.编程与应用题: 1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下. 参考程序: #!/bin/sh FILENAME= echo “Input file na ...

  5. Kafka connect快速构建数据ETL通道

    摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 业余时间调研了一下Kafka connect的配置和使用,记录一些自己的理解和心得,欢迎 ...

  6. Ubuntu16.04 server下配置MySQL,并开启远程连接

    背景 最近正在学nodejs,想到曾经有台云服务器,但是很久不用了,由于怕麻烦,一股脑的把云主机重装了个Ubuntu系统,于是配置MySQL成了配置服务中的一个环节(node用不用MySQL不管,主要 ...

  7. Spark-GraphxAPI学习笔记

    图的集合视图 graph包含三个基本的类集合视图: val vertices: VertexRDD[VD] val edges: EdgeRDD[ED] val triplets: RDD[EdgeT ...

  8. windows环境自动获取SVN仓库当前版本

    如果我们的软件能够自动引入SVN修订号(仓库版本号),那么我们开发软件的时候就能快速定位bug出自哪个SVN版本.那么如何让软件直接自动生成并引用SVN版本号呢? 我们可以使用SVN info命令,在 ...

  9. float 属性详解

    当前元素分类(float:left) 下一个紧邻元素分类(不含float) 结论 块级元素(a) 块级元素(b) b会填充a遗留下来的空间,a会和b发生重叠,a的图层在上面. 内联元素(b) b会紧跟 ...

  10. Html5浏览器端less应用

    之前的一个布局是用rem来做的 我上一段代码 div { margin: 0.833333333rem 0; } /* 去处a标签的下划线*/ a { text-decoration: none; } ...