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 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.

题解: 简单的深搜问题, 找两两配对且满足题意的组合数。

可是我开始也一直不会做,看了题解 才做出来,结果代码与官方代码相似度奇高。

ps:本人大三狗一枚,正在持续更新博客,文章里有任何问题,希望各位网友可以指出。若有疑问也可在评论区留言,我会尽快回复。希望能与各位网友互相学习,谢谢

/*
ID: cxq_xia1
PROG: wormhole
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=15;
int X[maxn],Y[maxn];
int N;
int nextRight[maxn],partner[maxn];

bool IsCycle()                                      //判断是否形成循环
{
    for(int start=1;start<=N;start++)
    {
        int pos=start;
        for(int cnt=0;cnt<N;cnt++)
        {
            pos=nextRight[partner[pos]];
        }
        if(pos!=0)
            return true;
    }
    return false;
}

int solve()                                         //DFS计算一共有多少种配对方法
{
    int i,ans=0;
    for(i=1;i<=N;i++)                               //找到第一个没有没有被匹配的虫洞i,把他拿出来
    {
        if(partner[i]==0)
            break;
    }
    if(i>N)                                         //当所有的虫洞都匹配了
    {
        if(IsCycle())                               //如果可以形成循环返回1,否则返回0
            return 1;
        else
            return 0;
    }

    for(int j=i+1;j<=N;j++)                           //把虫洞i拿去和其他没匹配的虫洞一一匹配
    {
        if(partner[j]==0)
        {
            partner[i]=j;
            partner[j]=i;

            ans+=solve();

            partner[i]=partner[j]=0;                //递归退层的撤销操作
        }
    }
    return ans;
}

int main()
{
    freopen("wormhole.in","r",stdin);
    freopen("wormhole.out","w",stdout);
    memset(partner,0,sizeof(partner));
    memset(nextRight,0,sizeof(nextRight));
    cin >> N;
    for(int i=1;i<=N;i++)
        cin >> X[i] >> Y[i];
    for(int i=1;i<=N;i++)                           //找到每个点与他Y坐标相同且最近的点
    {
        for(int j=1;j<=N;j++)
        {
            if(X[j]>X[i]&&Y[i]==Y[j])
            {
                if(nextRight[i]==0||X[j]<X[nextRight[i]])
                {
                    nextRight[i]=j;
                }
            }
        }
    }

    cout << solve() <<endl;
    return 0;
}

  

时间: 2024-12-18 04:27:22

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 Section1.3 Wormholes 解题报告

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

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 方向(右)的位置移动.贝

Wormholes USACO

先给个任意门: http://train.usaco.org/usacoprob2?a=Hjk3nSx2aDB&S=wormhole 又是一道好题直接解释吧~ x,y -> positionr[u] -> 第u个点右边第一个hole的位置partner[u] -> 与u相连的点 Then 怎么判断她就陷入循环了呢?也就是以下代码中n-1次判断走过虫洞并判断虫洞. pos表示从第pos个虫洞进入,进入后,我们自然就到达了 partener [pos]那下一个位置就是 r[ part

USACO Wormholes 【DFS】

描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他的虫洞将形成 N/2 连接配对.例如,如果A和B的虫洞连接成一对,进入虫洞A的任何对象体将从虫洞B出去,朝着同一个方向,而且进入虫洞B的任何对象将同样从虫洞A出去,朝着相同的方向前进.这可能发生相当令人不快的后果. 例如,假设有两个成对的虫洞A(1,1) 和 B(3,1),贝茜从(2,1)开始朝着 +x 方向(右)的位置移动.贝

USACO Wormholes(模拟)

题目请点我 题解: 这道题思路很简单,就是简单的深搜,找出所有的组合,然后判断能否成环.关键在于如何判断能否成环,我的思路是利用递归模拟,看能否第二次经过某一个点.中间也出现了错误,首先,每次访问的下一个点应该是同一行上当前点右边的第一个点:其次,某个点被访问过必须是作为起点被访问过,而不仅仅是到达. 代码实现: /* ID: eashion LANG: C++ TASK: wormhole */ #include <iostream> #include <cstdio> #inc

【USACO】Wormholes(暴力搜索)

直接按照题意暴力就行 /* ID: 18906421 LANG: C++ PROG: wormhole */ #include<cstdio> #include<cstring> #include<vector> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 15; LL v[maxn]; int

usaco Wormholes

有个数据能在我机子上跑对,在服务器上过不去,卡了我很久.后来才发现,有个数组大小少开了一个. 题意是,有头牛只会沿着x轴正方向走,但是y坐标随机.图上有很多虫洞,两两相连,从一个虫洞进去,从对应虫洞出来之后,牛还是会沿着x轴正方向走,让你统计虫洞两两相连的方式,其中会导致牛陷入循环的个数. 关于排列组合,两两相配的个数什么的还好,但是如何生成配对,编程什么的一开始我还真不会.以前也就自己写过全排列或者组合而已,没有写过这种. /* ID: modengd1 PROG: wormhole LANG

【USACO 1.3】Wormholes

/* LANG: C++ TASK: wormhole n个洞,n<=12, 如果两洞配对,则它们之间有地下路径(无向) 牛在地上只会往+x方向 问多少种两两配对的方案,牛从地上某位置出发,会陷入无限循环. SOLVE: 枚举所有配对方案,判断是否会进入无限循环. */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define N 15 int n,