kuangbin带你飞——专题一 简单搜索(7)
题目来源:POJ 3087 Shuffle’m Up
题解
暴力模拟该过程,在存入 map 容器之中,如果一种情况出现两次,跳出循环
AC代码
#include <iostream>
#include <map>
#include <cstring>
#include <cstdio>
using namespace std;
// 模拟函数
string shuf(string s, int l)
{
string s1, s2;
s1 = s.substr(0, l), s2 = s.substr(l);
s = "";
for (int i = 0; i < l; ++i)
{
s += s2[i], s += s1[i];
}
return s;
}
int main()
{
int t;
cin >> t;
for (int tt = 1; tt <= t; ++tt)
{
int l;
cin >> l;
string s1, s2, s12;
cin >> s1 >> s2 >> s12;
// map 存储已经出现的情况
map<string, int> mapp;
string tmp = "";
// 首次操作
for (int i = 0; i < l; ++i)
{
tmp += s2[i], tmp += s1[i];
}
int cnt = 1;
if (tmp == s12)
{
cout << tt << ' ' << cnt << endl;
break;
}
// 存入容器
mapp.insert(make_pair(tmp, 1));
// 递推
while (cnt++)
{
tmp = shuf(tmp, l);
// 当情况出现相同时,输出不可能
if (mapp[tmp] == 1)
{
cout << tt << ' ' << -1 << endl;
break;
}
// 到达目标情况,输出
if (tmp == s12)
{
cout << tt << ' ' << cnt << endl;
break;
}
// 否则,存入容器
else
{
mapp.insert(make_pair(tmp, 1));
}
}
}
return 0;
}