您的位置:首页 > 其它

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以前出现过,那么无解;

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: