poj 3087 Shuffle'm Up
2015-09-09 19:58
337 查看
题目大意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去,现在输入s1和s2的初始状态
以及 预想的最终状态s12,问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。
解题思路:
用map模拟,当a与b以前出现过,那么无解;
代码:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去,现在输入s1和s2的初始状态
以及 预想的最终状态s12,问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。
解题思路:
用map模拟,当a与b以前出现过,那么无解;
代码:
#include <iostream> #include <map> #include <string> #include <string.h> using namespace std; int n,res,ct; map<string,int>sti; bool vis[5010][5010]; int flag; string c; void dfs(string a,string b,int dep) { if (!sti.count(a)) sti[a] = ct++; if (!sti.count(b)) sti[b] = ct++; if (vis[sti[a]][sti[b]]) return ; vis[sti[a]][sti[b]] = true; string s; s.clear(); for(int i=0;i<n;i++) { s.push_back(b[i]); s.push_back(a[i]); } if(s==c) { flag=1; if(res>dep) res=dep; return; } a.clear(); b.clear(); for(int i=0;i<n;i++) { a.push_back(s[i]); } for(int i=n;i<2*n;i++) b.push_back(s[i]); dfs(a,b,dep+1); return; } int main() { int t; cin>>t; for(int i=1;i<=t;i++) { string a,b; memset(vis,0,sizeof(vis)); ct=0; res=0x7ffffff; cin>>n>>a>>b>>c; flag=0; sti.clear(); dfs(a,b,1); cout<<i<<" "; if(flag) cout<<res<<endl; else cout<<"-1"<<endl; } return 0; }
相关文章推荐
- ORA-00904:“”:标识符无效
- 1001--Java 多线程 并发编程
- URL最大长度
- Git book 中文
- GPU编程中的常用几何函数、纹理映射函数、偏导数函数
- 使用PHP7还是需要谨慎(2015-09-09)
- [sed] 分支&测试
- lesson1 - Navigation in Linux
- 神奇的点9工具与.9图片效果
- 引导页
- 时间问题
- huffman coding
- NYOJ 7 街区最短路径问题
- 研究生入学初期感悟
- BZOJ 1028: [JSOI2007]麻将 暴力
- 0909关于编译原理
- 如何去设计一个自适应的网页设计或HTMl5
- php-fpm的配置
- Windows 10 关键错误,“开始”菜单和 Cortana 无法工作。你下次登录时,我们将尝试解决此问题的解决方法
- POJ 2195 Going Home