原题地址
题目大意:
一个二维图上有N个虫洞(N一定是偶数),从一个虫洞可以直接传送到另一个和它相连的虫洞,(有且只有一个虫洞与某个虫洞相连)。进入虫洞的方向和出虫洞的方向一致。给出虫洞的坐标,问存在几种配对的方式使得小明(雾)从某个点出发回陷入无限循环..
一点感想..
这道题在搞组合的时候就出了点问题,一下子不知道怎么去除重复的组合..然后看了官方的解题视频,被震惊了..
直接用partner数组保存和某一虫洞相连的虫洞,找到一个没有配对的点就break所以可以保证不会产生重复的排列。保存离某个虫洞最近的那一个虫洞的下标(没有则为0),然后传送N次,如果还没传送出去就说明是无限循环。

代码

#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
#define MAXN 12
int partner[MAXN+1],x[MAXN+1],y[MAXN+1],right_next[MAXN+1];
int N;
bool judge()
{int pos;for(int start = 1;start<=N;start++){pos = start;for(int i = 0;i<N;i++){pos = partner[right_next[pos]];}if(pos!=0)return true;}return false;
}
int solve()
{int i,ret = 0;for(i = 1;i<=N;i++)if(!partner[i])break;if(i == N + 1){if(judge())ret++;return ret;}for(int j = i + 1;j<=N;j++){if(!partner[j]){partner[i] = j;partner[j] = i;ret += solve();partner[i] = partner[j] = 0;}}return ret;
}
int main()
{ifstream fin("wormhole.in");ofstream fout("wormhole.out");fin>>N;for(int i = 1;i<=N;i++)fin>>x[i]>>y[i];for(int i = 1;i<=N;i++){for(int j = 1;j<=N;j++){if(x[j] > x[i] && y[i] == y[j])if(right_next[i] == 0||x[j]-x[i]<x[right_next[i]]-x[i])right_next[i] = j;}}fout<<solve()<<endl;}

USACO_Wormholes相关推荐

最新文章

  1. 一文详解三维重建之定位定姿算法
  2. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、使用set_major_formatter函数自定义设置y轴数值标签格式为百分比
  3. 印度式画线乘法基本操作
  4. python 加密解密_python加密解密
  5. spring 的4种事务管理(1种编程式+3种声明式)
  6. 自我训练——时间控制能力(四)
  7. 自动化环境部署工具的编写
  8. leetcode-110:判断平衡二叉树 Java
  9. windows/linuxjdk安装,jdk1.6升级到1.7
  10. 超级实用springBoot学习
  11. 周一清晨的领导课读书笔记
  12. 阿里云 Aliplayer高级功能介绍(三):多字幕 1
  13. JDBC连接到sql server2008
  14. 动态RAM(64K*1)INTEL2164简介(抄自原理图)
  15. Ubuntu登录界面键盘鼠标失灵
  16. 自学Python之后如果不去公司上班,自己可以通过此技能挣什么钱?
  17. Enhancement(5)--Field Exits {转载}
  18. GICv3软件overview手册之虚拟化
  19. 项目策划 文件管理系统
  20. 传雅虎秘密搜索用户电邮为美国安全官员提供信息

热门文章

  1. Qt 精美的button合集
  2. MySQL42000错误
  3. Python的包安装工具——pip命令大全
  4. onSubmit与onClick的区别
  5. 搞定IC卡(上)-IC卡基础
  6. ANT 下载,ant的配法及用法
  7. sqlite3数据库损坏修复方法(windows下)
  8. html DOM------document
  9. Flink:watermark
  10. pairs和iparis