变幻的矩阵

GitHub跳转原题关系图返回列表

构造四种候选变换矩阵并依次与目标矩阵比较,输出匹配规则编号。

OJ: noi_openjudge

题目 ID: ch0108-12

难度:入门

标签:矩阵模拟分类讨论python

日期: 2026-07-30 23:01

题意

判断方阵经过顺时针、逆时针、中心对称、不变或其他哪种规则后得到目标矩阵。

思路

分别按下标关系构造顺时针、逆时针和中心对称矩阵。按照原题解的优先级先检查不变,再检查三种变换,未匹配则输出 55

代码

cpp
#include <cstdio>
#include <cstring>

int n;
char src[20][20];
char tmp[20][20];
char dst[20][20];

void clock(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[j][n-i+1] = src[i][j];
        }
    }
}

void p_t(){
    int i,j;
    printf("=====================\n");
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            printf("%c ",tmp[i][j]);
        }
        printf("\n");
    }
    printf("=====================\n");
}

void anti_clock(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[n-j+1][i] = src[i][j];
        }
    }
}

void trans(){
    anti_clock();
    //p_t();
    memcpy(src,tmp,sizeof(tmp));
    anti_clock();
    //p_t();
}

bool cmp(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            if( tmp[i][j] != dst[i][j])
                return 0;
        }
    }
    return 1;
}

void init(){
    scanf("%d",&n);
    char t[20];
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            scanf("%s",t);
            src[i][j] = t[0];
        }
    }
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            scanf("%s",t);
            dst[i][j] = t[0];
        }
    }
}
int main(){
    init();
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[i][j] = src[i][j];
        }
    }
    if( cmp() ){
        printf("4");
        return 0;
    }


    clock();
    if( cmp() ){
        printf("1");
        return 0;
    }

    anti_clock();
    if( cmp() ){
        printf("2");
        return 0;
    }

    trans();
    if( cmp() ){
        printf("3");
        return 0;
    }
    printf("5");
    return 0;
}

复杂度

总结

Python代码

python
size = int(input())
source = [input().split() for _ in range(size)]
target = [input().split() for _ in range(size)]

clockwise = [[source[size - 1 - column][row] for column in range(size)] for row in range(size)]
counterclockwise = [[source[column][size - 1 - row] for column in range(size)] for row in range(size)]
central = [row[::-1] for row in source[::-1]]

if target == source:
    print(4)
elif target == clockwise:
    print(1)
elif target == counterclockwise:
    print(2)
elif target == central:
    print(3)
else:
    print(5)

C++代码

cpp
#include <cstdio>
#include <cstring>

int n;
char src[20][20];
char tmp[20][20];
char dst[20][20];

void clock(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[j][n-i+1] = src[i][j];
        }
    }
}

void p_t(){
    int i,j;
    printf("=====================\n");
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            printf("%c ",tmp[i][j]);
        }
        printf("\n");
    }
    printf("=====================\n");
}

void anti_clock(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[n-j+1][i] = src[i][j];
        }
    }
}

void trans(){
    anti_clock();
    //p_t();
    memcpy(src,tmp,sizeof(tmp));
    anti_clock();
    //p_t();
}

bool cmp(){
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            if( tmp[i][j] != dst[i][j])
                return 0;
        }
    }
    return 1;
}

void init(){
    scanf("%d",&n);
    char t[20];
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            scanf("%s",t);
            src[i][j] = t[0];
        }
    }
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            scanf("%s",t);
            dst[i][j] = t[0];
        }
    }
}
int main(){
    init();
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++){
            tmp[i][j] = src[i][j];
        }
    }
    if( cmp() ){
        printf("4");
        return 0;
    }


    clock();
    if( cmp() ){
        printf("1");
        return 0;
    }

    anti_clock();
    if( cmp() ){
        printf("2");
        return 0;
    }

    trans();
    if( cmp() ){
        printf("3");
        return 0;
    }
    printf("5");
    return 0;
}

复杂度

构造和比较常数个 N×NN\times N 矩阵,时间与空间复杂度均为 O(N2)O(N^2)

总结

固定数量的几何变换,直接构造候选结果再比较最清楚。