2010年6月19日 星期六

Problem 466 Mirror, Mirror

此題給你兩種矩形,請你判斷第一種如何旋轉或者水平鏡照,會變成第二種。

例如給你一個 4 * 4 的矩陣,如下:
‧X‧‧
‧X‧X
‧‧‧‧
‧‧X‧

而矩陣的旋轉以及鏡照有以下幾種情況:
(1) 90 Degree Rotation:矩陣向右旋轉 90 度。
‧‧‧‧
‧‧XX
X‧‧‧
‧‧X‧

(2) 180 Degree Rotation:矩陣向右旋轉 180 度。
‧X‧‧
‧‧‧‧
X‧X‧
‧‧X‧

(3) 270 Degree Rotation:矩陣向右旋轉 270 度。
‧X‧‧
‧‧‧X
XX‧‧
‧‧‧‧

(4) Vertical Reflection:水平鏡照,上下如同看鏡子似的,相互鏡照。
‧‧X‧
‧‧‧‧
‧X‧X
‧X‧‧

(5) Combination:水平鏡照加上一個角度的旋轉。(以下是水平鏡照加上右轉 90 度角)
‧‧‧‧
XX‧‧
‧‧‧X
‧X‧‧

(6) Preservation:一開始就和原本的一樣。
(7) Improper:以上狀況都不符合的情況。

其實關鍵就在於你會不會寫轉換函式,寫完幾乎就已經完成了。以下為關鍵函式程式碼:
void rotation90()
{
int i, j;
for (i = 0; i < n; i ++)
strcpy(s[i], replace[i]);
for (i = 0; i < n; i ++)
for (j = 0; j < n; j ++)
replace[i][j] = s[n - j - 1][i];
}

void rotation180()
{
int i, j;
for (i = 0; i < n; i ++)
strcpy(s[i], replace[i]);
for (i = 0; i < n; i ++)
for (j = 0; j < n; j ++)
replace[n - i - 1][j] = s[i][n - j - 1];
}

void rotation270()
{
int i, j;
for (i = 0; i < n; i ++)
strcpy(s[i], replace[i]);
for (i = 0; i < n; i ++)
for (j = 0; j < n; j ++)
replace[j][i] = s[i][n - j - 1];

}

void reflection()
{
int i, j;
for (i = 0; i < n; i ++)
strcpy(s[i], replace[i]);
for (i = 0; i < n; i ++)
for (j = 0; j < n; j ++)
replace[n - j - 1][i] = s[j][i];
}

By David.K

p466題目連結
回ACM題庫目錄
回首頁

沒有留言: