Wormholes
2016-05-11 22:30
323 查看
http://train.usaco.org/usacoprob2?a=ekO1ud5KpT4&S=wormhole
题目大意:
已知N个虫洞的坐标,若2个虫洞(A,B)相互连通则可以从A进从B出,从B进从A出;奶牛从农场任意一点一直向右走,找出所有可能使奶牛在虫洞间无限循环的虫洞配对情况
总结:
看了标程后才写出来。。。
程序数据不多,可以按最直观的理解方式解决;因此这种题应先理清思路,按照题目要求分析解决过程中需要(必许用到的)用到数据;先解决数据问题,根据数据再解决具体算法问题
题目大意:
已知N个虫洞的坐标,若2个虫洞(A,B)相互连通则可以从A进从B出,从B进从A出;奶牛从农场任意一点一直向右走,找出所有可能使奶牛在虫洞间无限循环的虫洞配对情况
#include <iostream> #include <fstream> //1.将所有的虫洞两两配对 //2.从任意一个虫洞进入往右走进入下一个虫洞,检查是否会无限循环(如果从右边的最后一个出去,则不会无限循环) //需计算每个虫洞的配对信息和下一个虫洞的位置 using namespace std; struct wormholes { int x; int y; int next; int paired; } a[15]; int n, ans; bool isok() //检查是否会无限循环 { int i, j, k; for(i = 1; i <= n; i++) //从n个虫洞中任意一个进入 { k = i; for(j = 0; j <= n; j++, k = a[a[k].paired].next) if(a[a[k].paired].next == -1) break; if(j > n) return true; } return false; } void dfs(int m) //虫洞两两配对 原则:不重不漏 { if(m == n/2) if(isok()) { ans++; return; } int i; for(i = 1; i <= n; i++) //找到还未配对的 if(a[i].paired == -1) break; for(int j = i + 1; j <= n; j++) //对这一个虫洞遍历所有可能的配对(不会出现重复配对 ) if(a[j].paired == -1) { a[i].paired = j; a[j].paired = i; dfs(m + 1); a[i].paired = -1; a[j].paired =-1; } } int main() { ifstream fin("wormhole.in"); ofstream fout("wormhole.out"); ans = 0; fin >> n; for(int i = 1; i <= n; i++) fin >> a[i].x >> a[i].y; //读入虫洞坐标 //计算每个虫洞的下一个虫洞,若此虫洞在一行最后,则下一个为-1; for(int i = 1; i <= n; i++) { //找出纵坐标相等,很横坐标仅比x大的虫洞 a[i].paired = -1; a[i].next = -1; for(int j = 1; j <= n; j++) if(a[j].y == a[i].y && (a[j].x > a[i].x && (a[i].next == -1 || a[j].x < a[a[i].next].x))) a[i].next = j; } // for(int i = 1; i <= n; i++) cout << a[i].next <<" "; dfs(0); fout << ans << endl; fout.close(); return 0; }
总结:
看了标程后才写出来。。。
程序数据不多,可以按最直观的理解方式解决;因此这种题应先理清思路,按照题目要求分析解决过程中需要(必许用到的)用到数据;先解决数据问题,根据数据再解决具体算法问题
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- c++ primer 第五版 笔记前言
- 本人即将筹备败家日志,敬请期待!
- share_ptr的几个注意点
- IE:使用搜索助手
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例