G - Shuffle’m Up POJ - 3087
题意:洗牌,每次让两副牌依次合为一摞,每次s2的最后一张垫底,拆为两摞,下面一半为 s1,反复操作至出现目标情况,输出洗牌次数,如果出现重复,输出-1
dfs 水体
注意字符串的拼接方式
注意用 ios::sync_with_stdio(false); 清空缓冲区,可以使cin,cout的速度和scanf,printf相差无几
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
int n, ans;
string s1, s2, end, s;
map<string,int> mp; // 判断是否重复之前的情况
void dfs() {
string s;
for(int i = 0; i < n; i++) {
s += s2[i];
s += s1[i];
}
ans++;
if(mp[s] > 0) {
ans = -1;
return ; // 出现重复
}
mp[s] = ans;
if(s == end) return ; // 找到答案
s1 = ""; s2 = "";
for(int i = 0; i < n; i++) s1 += s[i];
for(int i = n; i < 2*n; i++) s2 += s[i];
dfs();
}
int main() {
// freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
int T;
cin >> T;
for(int kase = 1; kase <= T; kase++) {
ans = 0;
cin >> n;
cin >> s1 >> s2 >> end;
dfs();
cout << kase << " " << ans << endl;
}
return 0;
}