题目大意:

农场有N个洞(2<=N<=12,N为偶数),且组成N/2个连接对。每一个洞的给出平面坐标(x,y)。

假设A和B相连,则进入A会从B出来,进入B会从A出来。有仅仅会沿着x轴正方向前进的牛,非常可能就会陷入一个循环中。比如,A(1,1)。B(3,1),这头牛从(2,1)出发,首先会进入B,然后从A出来,由于牛仅仅沿着x方向前进,牛又进入了B,就这样无限循环下去了。

给定N个洞的坐标,牛能够从不论什么点出发,求全部可能出现 牛陷入循环的可能情况数(及N个洞的配对情况)

分析:

这个题目有个关键点,就是牛的走向。及牛仅仅能沿着x轴的正方向行走,要想形成无限循环,及每 当牛每次经过一个pair后,总能在其x正方向处存在下一个点。

所以题目的关键变为 寻找 平行的右邻接点

N的数目较小。对全部的情况进行列举就可以。

另外,无限循环的检測。发现一个 周期 就可以,或者。走过的次数大于 各个周期最大行走次数 后。这个点还有平行的右邻接点。由于一共就N个点。周期最大行走次数 肯定不会大于N (是否 不会大于N/2 还有待思考 )

/*
ID: abc18711
LANG: C
TASK: wormhole
*/
#include <stdio.h>
#include <string.h> #define MAXN 12+1 int X[MAXN];
int Y[MAXN]; int pair[MAXN];
int right_hole[MAXN]; int N; int exist_cycle()
{
int start_hole;
int flag;
int i; for (start_hole=1; start_hole<=N; start_hole++)
{
for (i=1,flag=start_hole; i<=N; i++)
{
flag = right_hole[ pair[flag] ];
if(flag == 0) break;
}
if (flag > 0) return 1;
} return 0; } // the pair combination int solutions()
{
int i;
int j;
int total = 0; //find first unpaired hole
for (i=1; i<=N; i++)
if(pair[i] == 0) break; //no unpaired hole,test the cycle
if (i > N){
return exist_cycle();
} //pairing i and j
for (j=i+1; j<=N; j++)
if (pair[j] == 0)
{
pair[i] = j;
pair[j] = i;
total += solutions();
pair[i] = pair[j] = 0;
} return total;
} int main()
{
int i;
int j; FILE *fin = fopen("wormhole.in", "r");
FILE *fout = fopen("wormhole.out", "w"); // get the input
fscanf(fin, "%d", &N); for (i=1; i<=N; i++)
fscanf(fin, "%d %d", &X[i], &Y[i]); memset(pair, 0, MAXN*sizeof(int));
memset(right_hole, 0, MAXN*sizeof(int)); // find the right hole
for( i=1; i<=N; i++)
for (j=1; j<=N; j++)
if (Y[i] == Y[j] && X[j] > X[i])
if (right_hole[i] == 0 || (X[j]-X[i]) < (X[ right_hole[i] ]-X[i]))
right_hole[i] = j; fprintf(fout, "%d\n", solutions()); return 0;
}

附录:

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.

UASCO Wormholes 解析 and C 语言实现的更多相关文章

  1. 二叉查找树(一)之 图文解析 和 C语言的实现

    概要 本章先对二叉树的相关理论知识进行介绍,然后给出C语言的详细实现.关于二叉树的学习,需要说明的是:它并不难,不仅不难,而且它非常简单.初次接触树的时候,我也觉得它似乎很难:而之所产生这种感觉主要是 ...

  2. AVL树(一)之 图文解析 和 C语言的实现

    概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...

  3. 伸展树(一)之 图文解析 和 C语言的实现

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  4. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  5. 左倾堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍左倾堆,它和二叉堆一样,都是堆结构中的一员.和以往一样,本文会先对左倾堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理 ...

  6. 二项堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二项堆,它和之前所讲的堆(二叉堆.左倾堆.斜堆)一样,也是用于实现优先队列的.和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  7. 斐波那契堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了 ...

  8. URL的解析,C语言实现

    源: URL的解析,C语言实现 c语言实现urlencode和decode

  9. .NET面试题解析(11)-SQL语言基础及数据库基本原理

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 本文内容涉及到基本SQL语法,数据的基本存储原理,数据库一些概念.数据优化等.抱砖引玉,权当一个综合复习! ...

随机推荐

  1. CLS(公共语言规范)的CLSCompliant(跨语言调用)

    .net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace  ...

  2. (C++)浅谈多态基类析构函数声明为虚函数

    主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...

  3. 轻量级UIImageView分类缓存 库 AsyncImageView 使用

    轻量级UIImageView分类缓存 库 AsyncImageView 使用 一: AsyncImageView 主页:https://github.com/nicklockwood/AsyncIma ...

  4. 安全的远程登录(SSH)

    Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层) ...

  5. 对hadoop 执行mapreduce时发生异常Illegal partition for的解决过程

    来自:http://blog.csdn.net/hezuoxiang/article/details/6878026 写了个mapreduce的JAVA程序,自定义了个partition class ...

  6. Edit Control响应全选(Ctrl+A)

    MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选.Ctrl+A不行,双击也不行. Ctrl+C和Ctrl+V都是默 ...

  7. GridLayout with span

    Widgets can span multiple columns or rows in a grid. In the next example we illustrate this. #!/usr/ ...

  8. HDU 5361 In Touch (2015 多校6 1009 最短路 + 区间更新)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5361 题意:最短路.求源点到全部点的最短距离.但与普通最短路不同的是,给出的边是某点到区间[l,r]内随意 ...

  9. java反射--获取成员变量信息

    获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...

  10. jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新

    转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...