UASCO Wormholes 解析 and C 语言实现

题目大意:

农场有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.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 15:18:59

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

[转载]AVL树(一)之 图文解析 和 C语言的实现

概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++和Java版本的实现. 建议:若您对"二叉查找树"不熟悉,建议先学完"二叉查找树"再来学习AVL树. 目录 1. AVL树的介绍 2. AVL树的C实现3. AVL树的C实现(完整源码) 4. AVL树的C测试程序 转载请注明出处:http://www.cnblogs.

[转载]伸展树(一)之 图文解析 和 C语言的实现

概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后,学习伸展树是一件相当容易的事情.和以往一样,本文会先对伸展树的理论知识进行简单介绍,然后给出C语言的实现.后序再分别给出C++和Java版本的实现:这3种实现方式的原理都一样,选择其中之一进行了解即可.若文章有错误或不足的地方,希望您能不吝指出! 目录 1. 伸展树的介绍 2. 伸展树的C实现 3. 伸展树的

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

概要 本章介绍二项堆,它和之前所讲的堆(二叉堆.左倾堆.斜堆)一样,也是用于实现优先队列的.和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理一样,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录1. 二项树的介绍2. 二项堆的介绍3. 二项堆的基本操作4. 二项堆的C实现(完整源码)5. 二项堆的C测试程序 转载请注明出处:http://www.cnblogs.com/skywan

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

概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆的C实现(完整源码)4. 斐波那契堆的C测试程序 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3659060.html 更多内容:数据结

深度解析Python动态语言

1.动态语言的定义 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言目前非常具有活力.例如JavaScript便是一个动态语言,除此之外如PHP.Ruby.Python等也都属于动态语言,而C.C++等语言则不属于动态语言.----来自维基百科 1.运行的过程中给对象绑定(添加)属性 运行结果: 这里我想给要在运行过程里给对象绑定属性 运行结果:

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

  系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 本文内容涉及到基本SQL语法,数据的基本存储原理,数据库一些概念.数据优化等.抱砖引玉,权当一个综合复习! 常见面试题目: 0. 基本SQL语法题目,在 正文“基础SQL语法”中有13道题,这里就略过了. 1. 索引的作用?她的优点缺点是什么? 2. 介绍存储过程基本概念和 她的优缺点? 3. 使用索引有哪些需要注意的地方? 4. 索引碎片是如何产生的?有什么危害?又该如何处理? 5. 锁的目的是什么? 6.

运算字符串解析(c语言)

运算字符的解析,如:43+表示:4+3, 25* 表示:2*5, 25*1+表示(2*5)+1,435/+表示:4 +(3/5) 1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <string.h> 4 5 bool isNumber(const char *c); 6 int getNumber(const char *c); 7 bool isOperator(const char *c); 8 floa

解析器组合子

本文引自:http://www.ibm.com/developerworks/cn/java/j-lo-compose/ Ward Cunningham 曾经说过,干净的代码清晰地表达了代码编写者所想要表达的东西,而优美的代码则更进一步,优美的代码看起来就像是专门为了要解决的问题而存在的.在本文中,我们将展示一个组合式解析器的设计.实现过程,最终的代码是优美的,极具扩展性,就像是为了解析特定的语法而存在的.我们还会选取 H.248 协议中的一个例子,用上述的组合式解析器实现其语法解析器.读者在这

jaxp解析XML之DOM解析

XML解析技术XML解析方式分为三种一种是DOM解析一种是SAX解析 DOM思想:将整个xml加载入内存,形成围挡对象,所有对xml操作都是对内存中节点对象进行,DOM是官方xml解析标准,同时支持解析其他各种语言 SAX解析方式的出现,因为DOM的解析方式需要对文档进行加载入内存,当文档较大的时候比较消耗资源,这时候就出现了SAX解析SAX思想:一边解析,一边处理,一边释放资源 在JDK6中又引入了另一种StAX解析方式是一种拉模式的xml解析方式,而SAX是一种推模式XML解析方式推模式由服