kuangbin專題 專題一 簡單搜索 Shuffle'm Up POJ - 3087

 

題意:(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 }
相關文章
相關標籤/搜索