ZZULIOJ 2507: 建國的尋寶之旅
阿新 • • 發佈:2019-01-11
題目描述
建國在元旦假期出去進行尋寶活動,在路上偶遇了也在尋寶的印第安納·瓊斯,於是他們組隊去尋寶。到達藏寶圖上的目標地點之後,他們發現洞穴的入口處有個機關,聰明的建國很快就發現了破解這個機關的方法。
機關是這樣的:
機關的旁邊有一張正方形石板,上面有著n x n的格子,每個格子裡都有一個鏤空的符號。
這塊石板可以進行6種操作:
1.將石板順時針旋轉90°
2.將石板順時針旋轉180°
3.將石板順時針旋轉270°
4.將石板逆時針旋轉90°
5.將石板逆時針旋轉180°
6.將石板逆時針旋轉270°
石板上有'M','W','3','E','|','-','.'七種符號,
每次石板通過一個操作的時候,不僅僅石板上每個格子的位置要變,對應方格上面的圖形由於翻轉也發生了相應的改變。
現在我們定義符號對應每一種操作之後的符號變換:
洞穴的牆壁上還有一串數字,表示操作石板的順序,只需要按照牆壁上的順序操作完石板,就得到了進入洞穴的密碼。
請幫助印第安納·瓊斯將洞穴裡的寶物放進博物館裡。
輸入
首先輸入一個整數n,表示矩陣的邊長。(1 <= n <= 1000)
接下來輸入一個n x n的字母矩陣,表示剛開始石板的形狀。
最後一行輸入一個字串(只包含1-6的數字,每個數字的大小對應的相應操作),代表一系列的操作(表示操作的字串的長度|s| , 1<=|s|<=1000)。
輸出
輸出一個n x n的字母矩陣,表示所有操作執行完後石板的形狀。
樣例輸入 Copy
9 MMMMMMMMM WWWWWWWWW ||||||||| --------- ......... ......... EEEEEEEEE 333333333 --------- 123456
樣例輸出 Copy
MMMMMMMMM WWWWWWWWW ||||||||| --------- ......... ......... EEEEEEEEE 333333333 ---------
AC程式碼(感謝ZHY/PK學長提供)
#include <bits/stdc++.h> const int MAXN = 1e3 +5; using namespace std; char maps[MAXN][MAXN]; map<char, int> mp; const char w[] = "M3WE"; const char c[] = "-|"; void init() { mp.insert(pair<char, int>('M', 0)); mp.insert(pair<char, int>('3', 1)); mp.insert(pair<char, int>('W', 2)); mp.insert(pair<char, int>('E', 3)); mp.insert(pair<char, int>('|', 1)); mp.insert(pair<char, int>('-', 0)); mp.insert(pair<char, int>('.', 0)); } int main() { init(); int n; cin >> n; for(int i = 0; i < n; i++) { cin >> maps[i]; } string s; cin >> s; int op = 0; for(int i = 0; i < s.length(); i++) { int fx = (int)(s[i]-'0'); if(fx > 3) fx = 7-fx; op = (op+fx)%4; } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(maps[i][j] == '.') continue; else if(maps[i][j] == '|' || maps[i][j] == '-') { maps[i][j] = c[(mp[maps[i][j]]+op)%2]; } else { maps[i][j] = w[(mp[maps[i][j]]+op)%4]; } } } if(op == 0) { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cout << maps[i][j]; } cout << endl; } } else if(op == 1) { for(int i = 0; i < n; i++) { for(int j = n-1; j >= 0; j--) { cout << maps[j][i]; } cout << endl; } } else if(op == 2) { for(int i = n-1; i >= 0; i--) { for(int j = n-1; j >= 0; j--) { cout << maps[i][j]; } cout << endl; } } else if(op == 3) { for(int i = n-1; i >= 0; i--) { for(int j = 0; j < n; j++) { cout << maps[j][i]; } cout << endl; } } }