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