題意:(1)有兩副顏色多樣的撲克牌,(A~H)表示不一樣顏色,給你兩副牌,S1,S2和一副你須要洗出的KEY,S12由S2最底部,S1底部。。。一直下去,直到洗成S12,就是圖片展現的那樣。
(2)洗好的S12能夠從新變成新的S1,S2,S1是從下取S12牌數的一半,S2的從上取S12牌數的一半,
問:這樣操做有限次,能不能洗出S3,能夠的話,求出最少洗牌次數,不能的話輸出-1.ios
思路:算一個水題吧,簡單的模擬,就是按照洗牌,拆牌那樣模擬就行了,爲了肯定這個KEY能不能洗出,函數
須要一個map<string,bool>,標記每次洗出的牌S12的字符串,若是洗出了以前洗出過的牌S12,說明KEY沒法被洗出。spa
1 #include <iostream>
2 #include <cstring>
3 #include<string>
4 #include <cmath>
5 #include <map>
6 #include <queue>
7 #include <algorithm>
8 using namespace std; 9
10 #define inf (1LL << 31) - 1
11 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
12 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
13 #define per(i,j,k) for(int i = (j); i >= (k); i--)
14 #define per__(i,j,k) for(int i = (j); i > (k); i--)
15
16 int ans; 17 string a, b, key; 18 int len; 19
20 //洗牌函數
21 inline void Insert(string& tmp, string& a, string& b){ 22
23 int l = 0; 24 rep__(i, 0, len){ 25 tmp[l++] = b[i]; 26 tmp[l++] = a[i]; 27 } 28 } 29
30 bool bfs(){ 31
32 map<string, bool> mp; 33 string tmp(2*len,'0'); 34 ans = 0;//初始化洗牌次數
35
36 Insert(tmp, a, b); 37
38 while (!mp[tmp]){ //該S12沒出現過
39 mp[tmp] = true; //標記新S12
40 ++ans; 41 if (tmp == key) return true; //洗出了KEY 42
43 //把S12拆成S1和S2
44 rep__(i, 0, len) a[i] = tmp[i]; 45 rep__(i, len, 2 * len) b[i - len] = tmp[i]; 46
47 //從新洗牌
48 Insert(tmp, a, b); 49 } 50
51 //洗不出KEY
52 return false; 53 } 54
55 int main(){ 56
57 ios::sync_with_stdio(false); 58 cin.tie(0); 59
60 int n; 61 cin >> n; 62
63
64 rep(i, 1, n){ 65 cin >> len >> a >> b >> key; 66
67 cout << i << " "; 68 if (bfs()) cout << ans << endl; 69 else cout << "-1" << endl; 70 } 71
72 return 0; 73 }