zoukankan      html  css  js  c++  java
  • 虫洞wormhole

    题目描述

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

    在这里插入图片描述
    农夫约翰知道他的农场里每个虫洞的确切位置。他知道贝茜总是向 +x 方向走进来,虽然他不记得贝茜的当前位置。请帮助农夫约翰计算不同的虫洞配对(情况),使贝茜可能被困在一个无限循环中,如果她从不幸的位置开始。

    输入输出格式

    输入格式:
    第1行:N(N<=12),虫洞的数目

    第2到N+1行:每一行都包含两个空格分隔的整数,描述一个以(x,y)为坐标的单一的虫洞。每个坐标是在范围 0-1000000000。

    输出格式:
    第1行:会使贝茜从某个起始点出发沿+x方向移动卡在循环中的不同的配对

    输入输出样例

    输入样例#1:
    4
    0 0
    1 0
    1 1
    0 1

    输出样例#1:
    2

    说明
    如果我们将虫洞编号为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,贝茜也会陷入循环。(如果贝西从3进去,1出来,她会走向2,然后被传送到4,最后又回到3)

    仅有1-4和2-3的配对允许贝茜从任何二维平面上的点向+x方向走不出现循环。
    .
    .
    .
    .
    .
    分析
    dfs+模拟检验
    .
    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,x[20],y[20],p[20],r[20];
     
    int check() 
    {
    	int pos,start;
    	for (int i=1;i<=n;i++) 
    	{
    		pos=start=i;
    		for (int cnt=0;cnt<n;cnt++) 
    		{
    			pos=p[r[pos]];
    			if (pos==start) return 1;
    			if (pos==0) break;
    		}
    	}
    	return 0;
    }
     
    int solve () 
    {
    	int i,j,ans=0;   
    	for (i=1;i<=n;i++) 
    		if (!p[i]) break;
    	
    	if (i==n+1) 
    	if (check())
    	{
    		ans++;
    		return ans;
    	}
    
    	for (j=i+1;j<=n;j++) 
    		if(!p[j]) 
    		{
    			p[i]=j;
    			p[j]=i;
    			ans+=solve();  
    			p[i]=p[j]=0;
    		}  
    	return ans;
    }
     
    int main () 
    {
    
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++) 
    		scanf("%d%d",&x[i],&y[i]);
    				
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=n;j++) 
    			if (y[i]==y[j]&&x[i]<x[j]) 
    			if (!r[i]||(x[r[i]]-x[i])>(x[j]-x[i])) r[i]=j;
    	
    	int w=solve();
    	printf("%d",w);
    	
    	return 0;
    	
    }
    
    
  • 相关阅读:
    入门MyBatis框架你一点都不需要慌
    手把手教你玩转Git
    小米商城项目(JSP+Servlet项目)
    超详细Maven技术应用指南
    如何深入理解关系型数据库的三大范式
    MySQL触发器的详细教学与实战分析
    cute-cnblogs 番外篇-自定义博客园样式美化
    2019以终为始,不迷茫的2020 | 前端小菜鸡的年度总结~
    可爱的博客园样式之自定义“评论区”样式
    Vue中使用key的作用
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292814.html
Copyright © 2011-2022 走看看