题意

之后补充。

分析

这是一条很好的考察递归(或者说搜索)的题目。它的两个过程(建立初步解,验证)都用到了递归(或者说运用递归可以相当程度的减少代码量)。

具体实现见代码。注意,为了使用std::pair的比较操作符,代码交换了x、y的位置。

代码

  1. /*
  2. ID: samhx1
  3. LANG: C++14
  4. TASK: wormhole
  5. */
  6. #include <bits/stdc++.h>
  7. #define MP make_pair
  8. #define PB push_back
  9. #define fi first
  10. #define se second
  11. #define ZERO(x) memset((x), 0, sizeof(x))
  12. #define ALL(x) (x).begin(),(x).end()
  13. #define rep(i, a, b) for (int i = (a); i <= (b); ++i)
  14. #define per(i, a, b) for (int i = (a); i >= (b); --i)
  15. #define QUICKIO \
  16. ios::sync_with_stdio(false); \
  17. cin.tie(0); \
  18. cout.tie(0);
  19. using namespace std;
  20. using ll = long long;
  21. using ull = unsigned long long;
  22. using pi = pair<ll,ll>;
  23. using pii = pair<ll, pi>;
  24. // Need to write editorial about it.
  25. template<typename T>
  26. T readint()
  27. {
  28. T tmp; cin>>tmp;
  29. return tmp;
  30. }
  31. int n,ans=0;
  32. pi pnt[15];
  33. ll nxt[15],partner[15];
  34. int vis[15];
  35. bool check(int spnt)
  36. {
  37. if(vis[spnt]>=2) return true;
  38. vis[spnt]++;
  39. if(nxt[spnt]==-1) return false;
  40. else
  41. {
  42. vis[nxt[spnt]]++;
  43. rep(i,1,n)
  44. {
  45. if(i!=nxt[spnt] && partner[nxt[spnt]]==partner[i])
  46. {
  47. return check(i);
  48. break; // should not be executed.
  49. }
  50. }
  51. }
  52. return false;
  53. }
  54. bool check()
  55. {
  56. for(int nowpnt=1;nowpnt<=n;++nowpnt)
  57. {
  58. memset(vis,0,sizeof(vis));
  59. if(check(nowpnt)) return true;
  60. }
  61. return false;
  62. }
  63. void solve(int dep)
  64. {
  65. if(dep==n/2)
  66. {
  67. rep(i,1,n) if(partner[i]==-1) return;
  68. if(check())
  69. {
  70. //rep(i,1,n) cout<<partner[i]<<" ";
  71. //cout<<endl;
  72. //cout<<"Success!"<<endl;
  73. ans++;
  74. }
  75. }
  76. else
  77. {
  78. rep(i,1,n)
  79. {
  80. if(partner[i]==-1)
  81. {
  82. partner[i]=dep+1;
  83. rep(j,i+1,n)
  84. {
  85. if(partner[j]!=-1) continue;
  86. partner[j]=dep+1;
  87. //printf("i=%d, j=%d: ",i,j);
  88. //rep(k,1,n) cout<<partner[k]<<" ";
  89. //cout<<endl;
  90. solve(dep+1);
  91. partner[j]=-1;
  92. }
  93. partner[i]=-1;
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. int main()
  100. {
  101. freopen("wormhole.in","r",stdin);
  102. freopen("wormhole.out","w",stdout);
  103. cin>>n;
  104. rep(i,1,n)
  105. {
  106. int x,y; cin>>x>>y;
  107. pnt[i]=MP(y,x); // WARN: x,y has been swapped.
  108. }
  109. sort(pnt+1,pnt+n+1);
  110. memset(nxt,-1,sizeof(nxt));
  111. rep(i,1,n)
  112. {
  113. if(i==n) continue;
  114. if(pnt[i+1].fi==pnt[i].fi) nxt[i]=i+1;
  115. }
  116. memset(partner,-1,sizeof(partner));
  117. solve(0);
  118. cout<<ans<<endl;
  119. return 0;
  120. }

「日常训练」「小专题·USACO」 Wormholes(1-4)的更多相关文章

  1. 「日常训练」「小专题·USACO」 Ski Course Design (1-4)

    题目 以后补 分析 mmp这题把我写蠢哭了 我原来的思路是什么呢? 每轮找min/max,然后两个决策:升min/降max 像这样子dfs找最优,然后花式剪枝 但是一想不对啊,这才1-4,哪有那么复杂 ...

  2. 「日常训练」「小专题·USACO」 Barn Repair(1-4)

    题意 之后补. 分析 这题同样也很精巧.我们不妨思考一下,如果只允许用一块木板,那么要购买多少距离?是整个的距离吗?不是,是从第一个到最后一个(哈哈哈哈哈哈哈).但是,不包括第一个的"左边& ...

  3. 「日常训练」「小专题·USACO」 Broken Necklace(1-2)

    题意 圆形链条,打断一处可以形成一条链.问在哪个地方开始打断,能够形成最大的连续颜色(白色视作同样的颜色)? 分析 说起来很高级,但是我们实际上并不需要穷举打断的地方,只需要把串重复三回啊三回.然后从 ...

  4. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  5. 「日常训练」「小专题·图论」Domino Effect(1-5)

    题意 分析 这题几乎就是一条dijkstra的问题.但是,如何考虑倒在中间? 要意识到这题求什么:单源最短路的最大值.那么有没有更大的?倒在中间有可能会使它更大. 但是要注意一个问题:不要把不存在的边 ...

  6. 「日常训练」「小专题·图论」 Cow Contest (1-3)

    题意 分析 问题是要看出来这是个floyd闭包问题.我没看出来- - 分析之后补充. 代码 // Origin: // Theme: Graph Theory (Basic) // Date: 080 ...

  7. 「日常训练」「小专题·图论」 Frogger (1-1)

    题意 分析 变形的dijkstra. 分析题意之后补充. 代码 // Origin: // Theme: Graph Theory (Basic) // Date: 080518 // Author: ...

  8. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  9. 「日常训练」Card Game Cheater(HDU-1528)

    题意与分析 题意是这样的:有\(n\)张牌,然后第一行是Adam的牌,第二行是Eve的牌:每两个字符代表一张牌,第一个字符表示牌的点数,第二个表示牌的花色.Adam和Eve每次从自己的牌中选出一张牌进 ...

随机推荐

  1. [18/11/22] 将点分十进制的IP地址化成二进制输出

    #include <stdio.h> void binary(int d){ ,j,n,b[]={}; ){ n=d%; d=d/; b[i++]=n; //不停的除2,余数保存在b[8] ...

  2. 2018.11.22 mac中"允许所有安装来源"的命令 & Mac窗口标题显示文件的路径

    当Mac遇到软件无法安装或者此文件已经损坏之类的时候 原因是软件为破解版,地址来源已改变,被系统拦截了,解决办法就是直接在终端中输入"sudo spctl --master-disable ...

  3. ueditor图片上传,网络连接错误的解决方案

    错误产生的原因是ueditor/net目录中的Uploader.cs在网站发布之后就没有了,重新上传这个文件,问题就解决了

  4. Django学习之ORM操作

    一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...

  5. vue使用v-for循环,动态修改element-ui的el-switch

    在使用element-ui的el-switch中,因为要用v-for循环,一直没有成功,后来仔细查看文档,发现可以这样写 <el-switch v-for="(item, key) i ...

  6. 嵌入式:UCOSIII的使用(17.01.24补充)

    0.一些移植.系统相关 OS_CFG_APP.H /* --------------------- MISCELLANEOUS ------------------ */ #define OS_CFG ...

  7. Spring Boot学习笔记(二二) - 与Mybatis集成

    Mybatis集成 Spring Boot中的JPA部分默认是使用的hibernate,而如果想使用Mybatis的话就需要自己做一些配置.使用方式有两种,第一种是Mybatis官方提供的 mybat ...

  8. jquery mobile 移动web(2)

    button 按钮 data-role="button" 将超链接变成button. 具有icon 图标的button 组件. 提供了18常用的图标 data-icon =&quo ...

  9. 关于mysql的优化

    MYSQL的优化一个很棘手的问题,也是一个公司最想处理得当的问题. 那么今天,本人为大家带来几点优化数据库的方法: 1.选取最适用的字段属性 一般来说,数据库的的表越小,在其上面执行的查询也会越快.因 ...

  10. go 下面定义嵌套结构

    package main import ( "fmt" ) const ( URL = "http://www.163.com" UID = "adm ...