Problem Description
给你T组数据,每组数据,输入一个n, 代表两幅扑克的数量,输入两幅扑克对应的字母,字母不同代表颜色不同,再输入一行,代表两个扑克混合在一起的结果。问你洗牌(交叉混合,第二幅扑克先在下)洗几次可以得到混合的扑克
代码:一开始没理解好题目,以为那一副扑克在下面都可以,就分了两种情况,发现得不到样例的结果,后面发现是按一种情况洗牌而已
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
char s1[200], s2[200], s12[200], ss[250];//第一幅扑克,第二幅扑克,扑克混合结果,扑克混合
int n;
map<string, int> vis;
queue<string> q;
void f2()//洗牌
{
int top = 0;
for(int i = 0; i < n; i++)
{
ss[top++] = s2[i];
ss[top++] = s1[i];
}
ss[top] = '\0';
}
void bfs()
{
while(!q.empty()) q.pop();//初始化队列
int i;
f2();//洗牌
if(!vis.count(ss))//没有出现过的混合情况
{
vis[ss] = 1;//第一次洗
q.push(ss);//入队列
}
char sx[250];
while(!q.empty())
{
strcpy(sx, q.front().c_str());//取其string, char形式
q.pop();
if(strcmp(sx, s12) == 0)//等于结果输出答案
{
printf("%d", vis[sx]);
printf("\n");
return ;
}
int top = 0;
for(i = 0; i < 2 * n; i++)//拆开来,s1等于下面的n个,s2等于上面的n个
{
if(i < n)
{
s1[top++] = sx[i];
if(top == n)
{
s1[top] = '\0';
top = 0;
}
}
else
{
s2[top++] = sx[i];
if(top == 2 * n)
{
s2[top] = '\0';
}
}
}
f2();//洗牌
if(!vis.count(ss))//判断是否已经有
{
vis[ss] = vis[sx] + 1;//洗牌次数+1
q.push(ss);
}
}
printf("%d\n", -1);//找不到答案
}
int main()
{
int T, Case = 1;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
scanf("%s %s %s", s1, s2, s12);
printf("%d ", Case++);
bfs();
vis.clear();
}
return 0;
}