Transformations
題目描述
一塊N x N(1<=N<=10)正方形的黑白瓦片的圖案要被轉換成新的正方形圖案。寫一個程序來找出將原始圖案按照以下列轉換方法轉換成新圖案的最小方式:
1:轉90度:圖案按順時針轉90度。
2:轉180度:圖案按順時針轉180度。
3:轉270度:圖案按順時針轉270度。
4:反射:圖案在水平方向翻轉(以中央鉛垂線爲中心形成原圖案的鏡像)。
5:組合:圖案在水平方向翻轉,然後再按照1到3之間的一種再次轉換。
6:不改變:原圖案不改變。
7:無效轉換:無法用以上方法得到新圖案。
如果有多種可用的轉換方法,請選擇序號最小的那個。
只使用1–7中的一個步驟來完成這次轉換。
輸入輸出格式
輸入格式:
第一行: 單獨的一個整數N。
第二行到第N+1行: N行每行N個字符(不是“@”就是“-”);這是轉換前的正方形。
第N+2行到第2*N+1行: N行每行N個字符(不是“@”就是“-”);這是轉換後的正方形。
輸出格式:
單獨的一行包括1到7之間的一個數字(在上文已描述)表明需要將轉換前的正方形變爲轉換後的正方形的轉換方法。
輸入輸出樣例
輸入樣例#1:
3
@-@
@@-
@-@
@–
–@
輸出樣例#1:
1
本題利用了一些格式規整的範式來進行矩陣的變換和處理,將複雜、重複性高的部分放入幾個函數中完成,按照順序一個個進行檢驗。
Code
#include<iostream>
#include<cmath>
using namespace std;
int n,i,j,k=1,temp;//k用於標記序號
bool sc = false;
bool a[11][11]={0},b[11][11]={0};//a原正方形,b轉換後正方形
char ch;
void image_by_inversion()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n/2;j++)
{
temp=a[i][j];
a[i][j]=a[i][n-j+1];
a[i][n-j+1]=temp;
}
}
void rotate90()
{
int m[11][11];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
m[j][n-i+1]=a[i][j];//旋轉
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=m[i][j];//返回正方形
}
void judgement()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]!=b[i][j])
return;
cout <<k <<endl;
exit(0); // 直接退出main 此處不可以寫 return
}
int main()
{
cin>>n;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
cin>>ch;
if (ch=='@') a[i][j]=1;
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
cin>>ch;
if (ch=='@') b[i][j]=1;
}
}
rotate90();judgement();k++;
rotate90();judgement();k++;
rotate90();judgement();k++;
rotate90();
image_by_inversion();judgement();k++;
rotate90();judgement();
rotate90();judgement();
rotate90();judgement();k++;
rotate90();
image_by_inversion();
judgement();
cout<<"7"<<endl;//沒找到,直接輸出7
return 0;
}