1. 程式人生 > 實用技巧 >洛谷-P1205 [USACO1.2]方塊轉換 Transformations

洛谷-P1205 [USACO1.2]方塊轉換 Transformations

洛谷-P1205 [USACO1.2]方塊轉換 Transformations

原題連結:https://www.luogu.com.cn/problem/P1205


題目描述

一塊 \(n \times n\) 正方形的黑白瓦片的圖案要被轉換成新的正方形圖案。寫一個程式來找出將原始圖案按照以下列轉換方法轉換成新圖案的最小方式:

  • 轉 90°:圖案按順時針轉 90°。
  • 轉 180°:圖案按順時針轉 180°。
  • 轉 270°:圖案按順時針轉 270°。
  • 反射:圖案在水平方向翻轉(以中央鉛垂線為中心形成原圖案的映象)。
  • 組合:圖案在水平方向翻轉,然後再按照 \(1 \sim 3\)
    之間的一種再次轉換。
  • 不改變:原圖案不改變。
  • 無效轉換:無法用以上方法得到新圖案。

如果有多種可用的轉換方法,請選擇序號最小的那個。

只使用上述 \(7\) 箇中的一個步驟來完成這次轉換。

輸入格式

第一行一個正整數 \(n\)

然後 \(n\) 行,每行 \(n\) 個字元,全部為 @-,表示初始的正方形。

接下來 \(n\) 行,每行 \(n\) 個字元,全部為 @-,表示最終的正方形。

輸出格式

單獨的一行包括 \(1 \sim 7\) 之間的一個數字(在上文已描述)表明需要將轉換前的正方形變為轉換後的正方形的轉換方法。

輸入輸出樣例

輸入 #1

3
@-@
---
@@-
@-@
@--
--@

輸出 #1

1

說明/提示

【資料範圍】
對於 \(100\%\) 的資料,\(1\le n \le 10\)

題目翻譯來自NOCOW。

USACO Training Section 1.2

C++程式碼

#include <iostream>
using namespace std;

int n;
char a[10][10], b[10][10], c[10][10], d[10][10];

void rotate(char x[][10], char y[][10]) {
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            y[j][n-i-1] = x[i][j];
}

void flip(char x[][10], char y[][10]) {
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            y[i][n-j-1] = x[i][j];
}

bool isEqual(char x[][10], char y[][10]) {
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            if (x[i][j] != y[i][j])
                return false;
    return true;
}

void copy(char x[][10], char y[][10]) {
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            y[i][j] = x[i][j];
}

int main() {
    cin >> n;
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            cin >> a[i][j];
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            cin >> b[i][j];
    copy(a, d);
    for (int i=1; i<=3; ++i) {
        rotate(d, c);
        if (isEqual(c, b)) {
            cout << i << endl;
            return 0;
        }
        copy(c, d);
    }
    flip(a, d);
    if (isEqual(d, b)) {
        cout << 4 << endl;
        return 0;
    }
    for (int i=0; i<3; ++i) {
        rotate(d, c);
        if (isEqual(c, b)) {
            cout << 5 << endl;
            return 0;
        }
        copy(c, d);
    }
    if (isEqual(a, b)) {
        cout << 6 << endl;
        return 0;
    }
    cout << 7 << endl;
    return 0;
}