建國的尋寶之旅
建國的尋寶之旅
題目描述
建國在元旦假期出去進行尋寶活動,在路上偶遇了也在尋寶的印第安納·瓊斯,於是他們組隊去尋寶。到達藏寶圖上的目標地點之後,他們發現洞穴的入口處有個機關,聰明的建國很快就發現了破解這個機關的方法。
機關是這樣的:
機關的旁邊有一張正方形石板,上面有著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的字母矩陣,表示所有操作執行完後石板的形狀。
樣例輸入
9 MMMMMMMMM WWWWWWWWW ||||||||| --------- ......... ......... EEEEEEEEE 333333333 --------- 123456
樣例輸出
MMMMMMMMM WWWWWWWWW ||||||||| --------- ......... ......... EEEEEEEEE 333333333 ---------
解題思路:本題雖然在操作之後要改變每一個字元,但是更要注意的是在改變字元的
同時,位置也會發生改變,需要自己仔細想一想該如何改變位置,而操作也不能進行
一次操作就改變一次,這會十分麻煩,所以我們可以將操作進行一個彙總,最後再將
度數取餘360看看進行的是什麼操作,最後其實只有四種情況,一是位置沒有發生改
變,二是順時針90度或逆時針270度,三是順時針180或逆時針180,四是順時針270
或逆時針90
程式碼如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
char MAP[1005][1005] = {0};
char a[1005] = {0};
for(int i = 0; i < n; i++)
scanf("%s", MAP[i]);
scanf("%s", a);
int len = strlen(a);
int ans = 0;//計算總操作 ,順時針加,逆時針減
for(int i = 0; i < len; i++)
{
if(a[i] == '1')
ans = ans + 90;
else if(a[i] == '2')
ans = ans + 180;
else if(a[i] == '3')
ans = ans + 270;
else if(a[i] == '4')
ans = ans - 90;
else if(a[i] == '5')
ans = ans - 180;
else
ans = ans - 270;
}
ans = ans % 360;//取餘360看看到底進行的是哪種操作
if(ans == 0) //當沒有改變時直接輸出
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%c", MAP[i][j]);
printf("\n");
}
if(ans == 90||ans == -270)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j] = '3';
else if(MAP[i][j] == 'W')
MAP[i][j] = 'E';
else if(MAP[i][j] == '3')
MAP[i][j] = 'W';
else if(MAP[i][j] == 'E')
MAP[i][j] = 'M';
else if(MAP[i][j] == '-')
MAP[i][j] = '|';
else if(MAP[i][j] == '|')
MAP[i][j] = '-';
}
}
for(int i = 0; i < n; i++) //改變位置輸出結果,以下同理
{
for(int j = n - 1; j >= 0; j--)
printf("%c",MAP[j][i]);
printf("\n");
}
}
if(ans == 180 || ans == -180)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j] = 'W';
else if(MAP[i][j] == 'W')
MAP[i][j] = 'M';
else if(MAP[i][j] == '3')
MAP[i][j] = 'E';
else if(MAP[i][j] == 'E')
MAP[i][j] = '3';
}
}
for(int i = n - 1; i >= 0; i--)
{
for(int j = n - 1; j >= 0; j--)
printf("%c",MAP[i][j]);
printf("\n");
}
}
if(ans == -90 || ans == 270)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j]='E';
else if(MAP[i][j] == 'W')
MAP[i][j]='3';
else if(MAP[i][j] == '3')
MAP[i][j]='M';
else if(MAP[i][j] == 'E')
MAP[i][j]='W';
else if(MAP[i][j] == '-')
MAP[i][j]='|';
else if(MAP[i][j] == '|')
MAP[i][j]='-';
}
}
for(int i = n - 1; i >= 0; i--)
{
for(int j = 0; j < n; j++)
printf("%c",MAP[j][i]);
printf("\n");
}
}
}