构造四种候选变换矩阵并依次与目标矩阵比较,输出匹配规则编号。
OJ: noi_openjudge
题目 ID: ch0108-12
难度:入门
标签:矩阵模拟分类讨论python
日期: 2026-07-30 23:01
题意
判断方阵经过顺时针、逆时针、中心对称、不变或其他哪种规则后得到目标矩阵。
思路
分别按下标关系构造顺时针、逆时针和中心对称矩阵。按照原题解的优先级先检查不变,再检查三种变换,未匹配则输出
代码
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;
}复杂度
构造和比较常数个
总结
固定数量的几何变换,直接构造候选结果再比较最清楚。