UASCO 1.3 wormholes
来源:互联网 发布:红包尾数软件 编辑:程序博客网 时间:2024/06/05 20:07
解题思路
通过回溯求出所有组合,然后枚举每个入口进入后是否进入死循环;
解题步骤
1. 将虫洞排序(先按y坐标排, y坐标相同相同再排x坐标);
bool cmp(map c,map v){ if(c.y==v.y) return c.x<v.x; return c.y<v.y;}
2.记录每个点t沿x轴方向右边最近的点,保存在next[t]中,若右边没有点,则next[t]=0(由于这里排过序了,所以可以线性查找);
for( int i=1 ; i<n ; i++ ){ if(p[i].y<p[i+1].y; next[i]=i+1;}
3.回溯,求出n个数两两配对的所有组合,用数组a存,单双成对;
考虑到不能重复(比如12 34和12 43和34 12)这里的限制条件是:偶数位cs一定大于他的前一位cs-1,奇数位一定大于他的前面第二位cs-2;
cs>n时得到一组解
void hs(int cs){ if(cs>n) { for(int i=1;i<n;i+=2) { partner[a[i]]=a[i+1]; partner[a[i+1]]=a[i]; } sum+=pd(); return; } if(cs%2!=0) { if(cs>1) { for(int i=a[cs-2];i<=n;i++) { if(book[i]==0) { book[i]=1; a[cs]=i; hs(cs+1); book[i]=0; } } return; } for(int i=1;i<=n;i++) { if(book[i]==0) { book[i]=1; a[cs]=i; hs(cs+1); book[i]=0; } } return ; } if(cs%2==0) { for(int i=a[cs-1]+1;i<=n;i++) { if(book[i]==0) { book[i]=1; a[cs]=i; }ok[i]=0; } } return;
4.每得到一组解,进行判断:从每个点进去,模拟运动情况,判断是否会进入死循环;
int pd(){ int flag=0; for(int i=1;i<=n;i++) { memset(book2,0,sizeof(book2)); flag=enter(i); if(flag==1)return 1; } return 0;}
5.模拟从每个点进去的结果,不会循环返回0,会循环返回1;
int enter(int po){ int t=po; int now=1; while(1) { if(now==1) { book2[t]=1; t=partner[t]; now=0; } if(now==0) { if(next[t]==0) return 0; t=next[t]; if(book2[t]==1) return 1; book2[t]=1; now=1; } }}
0 0
- UASCO 1.3 wormholes
- UASCO Wormholes 解析 and C 语言实现
- UASCO friday
- USACO Section 1.3 Wormholes
- USACO 1.3.5 Wormholes
- USACO 1.3 Wormholes
- USACO 1.3 Wormholes 虫洞
- USACO 1.3 Wormholes
- USACO 1.3-Wormholes
- USACO 1.3 Wormholes
- USCAO-Section 1.3 Wormholes
- USACO section 1.3 Wormholes
- USACO Section 1.3 Wormholes
- [USACO-Training 1.3]Wormholes
- Wormholes
- Wormholes
- Wormholes
- Wormholes
- Android-利用Document来对xml进行读取和写入操作-Oak先生
- 词法分析实验
- 网页报表等无法打印提示网页上有错误的解决办法
- 守护进程的详细总结(包括实例解析)
- hadoop 常见错误
- UASCO 1.3 wormholes
- 递归下降语法分析实验
- 我是一只IT小小鸟(转载)
- STL源码分析(1) -- STL介绍和源码分析之前的一些准备
- Leetcode 169, 229 Majority element
- 面向对象的十大设计原则
- 设计模式六大原则
- 第一章 Java基础
- Artificial Intelligence resources