USACO 1.3 Wormholes (不会做,贴官方解答)

描述

农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致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

[编辑]SAMPLE
OUTPUT

2

[编辑]HINTS

[编辑]输入详细信息

有4个虫洞,在一个正方形角上。

[编辑]输出详细信息

如果我们将虫洞编号为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。

仅有1-4和2-3的配对允许贝西从任何二维平面上的点向+x方向走不出现循环。

/*
  ID:twd30651
  PROG:wormhole
  LANG:C++
*/
//官方解答
#include <iostream>
#include <fstream>
using namespace std;
#define MAX_N 12

int N, X[MAX_N+1], Y[MAX_N+1];
int partner[MAX_N+1];
int next_on_right[MAX_N+1];

bool cycle_exists(void)
{
    for (int start=1; start<=N; start++) {
        // does there exist a cylce starting from start
        int pos = start;
        for (int count=0; count<N; count++)
        {
            pos = next_on_right[partner[pos]];
        }
        if (pos != 0) return true;
    }
    return false;
}

// count all solutions
int solve(void)
{
    // find first unpaired wormhole
    int i, total=0;
    for (i=1; i<=N; i++)
        if (partner[i] == 0) break;

    // everyone paired?
    if (i > N) {
        if (cycle_exists()) return 1;
        else return 0;
    }

    // try pairing i with all possible other wormholes j
    for (int j=i+1; j<=N; j++)
        if (partner[j] == 0) {
            // try pairing i & j, let recursion continue to
            // generate the rest of the solution
            partner[i] = j;
            partner[j] = i;
            total += solve();
            partner[i] = partner[j] = 0;
        }
    return total;
}

int main(void)
{
    ifstream fin("wormhole.in");
    fin >> N;
    for (int i=1; i<=N; i++) fin >> X[i] >> Y[i];
    fin.close();

    for (int i=1; i<=N; i++) // set next_on_right[i]...
        for (int j=1; j<=N; j++)
            if (X[j] > X[i] && Y[i] == Y[j]) // j right of i...
                if (next_on_right[i] == 0 ||
                    X[j]-X[i] < X[next_on_right[i]]-X[i])
                    next_on_right[i] = j;
    //找出紧邻的右边平行点

    ofstream fout("wormhole.out");
    fout << solve() << "\n";
    //  cout<<solve()<<endl;
    fout.close();
    return 0;
}
时间: 2024-10-10 17:49:42

USACO 1.3 Wormholes (不会做,贴官方解答)的相关文章

[题解]USACO 1.3 Wormholes

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 coordin

USACO 1.3 Wormholes

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 coordin

USACO Section1.3 Wormholes 解题报告

wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 一个人在二维坐标系上走,方向永远是+x.此坐标系中有N个虫洞(N是偶数). 虫洞这东西,一旦两个配成一对,便可以形成“传送门

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo

seo高手教你seo优化排名该怎么做

第一节:如何在本地搭建服务器环境 本节课程主要是讲如何利用 Xampp在本地搭建服务器环境 .网站使用asp和php比较常见,当然,就目前而言,使用php搭建网站的站长居多.需要在本地打造一个php环境,相当于Windows+Apache+MySQL+PHP的组合环境.Apache是Web服务器软件,MySQL是我们的数据库,php是我们的开发语言,需要一个php运行的环境.至于具体这整体环境该怎么弄,直接百度即可. 第二节:给网站设置目标关键词 网站目标关键词分为网站主关键词.栏目页关键词和文

剑指Offer对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in

【COGS】894. 追查坏牛奶

http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1000) #include <bits/stdc++.h> using namespace std; typedef long long ll; struct Gr { static const int N=33, M=1005, oo=~0u>>1; struct E { int n

Android热修复:Andfix和Hotfix,两种方案的比较与实现

Andfix和hotfix是两种android热修复框架. android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好.Hotfix框架算是对上文提到的QQ空间团队理论实现.本文旨在写实现方案,捎带原理. Andfix 引入 框架官网:https://github.com/alibaba/AndFix 介绍是用英文

微信硬件平台

调用openApi 微信硬件平台是微信推出连接物与人,物与物的IOT解决方案.也就是说可以通过微信控制各种智能设备.比如一些蓝牙设备.空调.电视等等. 我本身不懂硬件(虽然是电子信息专业),硬件是北航的两个研究生在弄,小团队里我负责开发H5自定义面板,刚开始看官方文档各种迷糊,对于jssdk.jsapi.Airkiss.openApi.直连SDK都不知道该用哪个做,官方论坛问问题基本上没结果,加了几个微信硬件群问问题,发现好些开发者和我一样,同一个问题,发到几个群里问,画面好心酸.给wxthin