Skip to content

11248: 【原1248】Square

题目

题目描述

author: Lin Li 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1248

Description

一块\( N \times N (1 \leq N \leq 10) \)正方形图案要被转换成给定的新图案。请你从下列选出一种序号最小的转换方式,使原图案能够转换成新图案:

1:图案按顺时针转90度。

2:图案按顺时针转180度。

3:图案按顺时针转270度。

4:水平翻转。

5:图案先水平翻转,然后再按照1到3之间的一种再次转换。

6:原图案不改变。

7:无法用以上方法得到新图案。

只使用1到7之间的一种来完成这次转换。

如果有多种可用的转换方式,请选择序号最小的。

Input Format

第一行:单独的一个整数N, \( 1 \leq N \leq 10 \)。

第二行到第N+1行:一共N行,每行N个字符(不是“@”就是“-”);这是转换前的正方形。

第N+2行到第2*N+1行: 一共N行,每行N个字符(不是“@”就是“-”);这是转换后的正方形。

Output Format

1到7之间的一个数字,表示序号最小的转换方式。

Sample Input

3
@[email protected]
---
@@-
@[email protected]
@--
[email protected]

Sample Output

1

yyong119's solution

#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    char square1[n][n], square2[n][n];

    for (int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
            cin >> square1[i][j];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            cin >> square2[i][j];

    int flag = 1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (square1[i][j] != square2[j][n - 1 - i])
                flag = 0;
    if (flag) {
        cout << 1 << endl;
        return 0;
    }

    flag = 1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (square1[i][j] != square2[n - 1 - i][n - 1 - j])
                flag = 0;
    if (flag) {
        cout << 2 << endl;
        return 0;
    }

    flag = 1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (square1[i][j] != square2[n - 1 - j][i])
                flag = 0;
    if (flag) {
        cout << 3 << endl;
        return 0;
    }

    flag=1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (square1[i][j] != square2[i][n - 1 - j])
                flag = 0;
    if (flag) {
        cout << 4 << endl;
        return 0;
    }

    int s1 = 1, s2 = 1, s3 = 1;
    flag = 1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j) {
            if (square1[i][j] != square2[j][i])
                s1 = 0;
            if (square1[i][j] != square2[n - 1 - i][j])
                s2 = 0;
            if (square1[i][j] != square2[n - 1 - j][n - 1 - i])
                s3 = 0;
        }
    if (s1 || s2 || s3) {
        cout << 5 << endl;
        return 0;
    }

    flag = 1;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (square1[i][j] != square2[i][j])
                flag = 0;
    if (flag)
        cout << 6 << endl;
    else
        cout << 7 << endl;
    return 0;
}

zqy2018's solution

#include <bits/stdc++.h>
using namespace std;
char ori[12][12], now[12][12], to[12][12];
int n, tmp;
int m1(){ 
    for(int i = 0; i < n; ++i)
        for(int j = n - 1; j >= 0; --j)
            now[i][n - 1 - j] = ori[j][i];
}
int m2(){
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            now[i][j] = ori[n - 1 - i][n - 1 - j];
}
int m3(){
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            now[i][j] = ori[j][n - 1 - i];
}
int m4(){
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            now[i][j] = ori[i][n - 1 - j];
}
bool judge(){
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (now[i][j] != to[i][j])
                return false;
    return true;
}
int main(){
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%s", ori[i]);
    for (int i = 0; i < n; ++i)
        scanf("%s", to[i]);
    int (*fun[])() = {m1, m2, m3, m4};
    for (int i = 0; i < 6; ++i){
        if (i < 4){
            fun[i]();
            if (judge()) {
                printf("%d\n", i + 1);
                return 0;
            }
        }else if (i == 4){
            for (int k = 0; k < n; ++k)
                for (int j = 0; j < (n / 2); ++j)
                    swap(ori[k][n-j-1], ori[k][j]);
            for (int k = 0; k < 4; ++k){
                fun[k]();
                if (judge()) {
                    printf("%d\n", 5);
                    return 0;
                }
            }
            for (int k = 0; k < n; ++k)
                for (int j = 0; j < (n / 2); ++j)
                    swap(ori[k][n-j-1], ori[k][j]);
        }else {
            for (int i = 0; i < n; ++i)
                for (int j = 0; j < n; ++j)
                    now[i][j] = ori[i][j];
            if (judge()) {
                printf("%d\n", 6);
                return 0;
            }
        }
    }
    printf("7\n");
    return 0;  
}