题目大意:
已知一个初始矩阵和一个目标矩阵还有几种操作,问起始矩阵经过那种操作可以得到目标矩阵。
思路:
模拟题,思路见注释。唯一需要注意的是判断操作需要按照题目所给顺序进行。
代码:
/* ID: lujunda1 LANG: C++ PROG: transform */ #include<iostream> #include<stdio.h> #include<cstring> #include<cstdio> #include<stdlib.h> using namespace std; int n; //判断a[][]与a[][]是否相等 bool equ(char a[][11],char b[][11]) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(a[i][j]!=b[i][j]) return false; return true; } //判断a[][]顺时针旋转90°后是否等于b[][] bool rotation_1(char a[][11],char b[][11]) { char temp[11][11]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) temp[i][j]=a[j][n-1-i]; if(equ(temp,b)) return true; return false; } //判断a[][]顺时针旋转180°后是否等于b[][] bool rotation_2(char a[][11],char b[][11]) { char temp[11][11]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) temp[i][j]=a[n-1-i][n-1-j]; if(equ(temp,b)) return true; return false; } //判断a[][]顺时针旋转270°后是否等于b[][] bool rotation_3(char a[][11],char b[][11]) { char temp[11][11]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) temp[i][j]=a[n-1-j][i]; if(equ(temp,b)) return true; return false; } //b[][]镜面反射后的结果赋值给a[][] void reflect(char a[][11],char b[][11]) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=b[i][n-1-j]; } //判断a[][]做镜面处理后是否与b[][]相等 bool reflection(char a[][11],char b[][11]) { char temp[11][11]; reflect(temp,a); if(equ(temp,b)) return true; return false; } //判断a[][]做镜面处理后再旋转后是否与b[][]相等 bool combination(char a[][11],char b[][11]) { char temp[11][11]; reflect(temp,a); if(rotation_1(temp,b)||rotation_2(temp,b)||rotation_3(temp,b)) return true; return false; } void check(char before[][11],char after[][11]) { if(rotation_1(before,after)) printf("1\n"); else if(rotation_2(before,after)) printf("2\n"); else if(rotation_3(before,after)) printf("3\n"); else if(reflection(before,after)) printf("4\n"); else if(combination(before,after)) printf("5\n"); else if(equ(before,after)) printf("6\n"); else printf("7\n"); } int main() { freopen("transform.in","r",stdin); freopen("transform.out","w",stdout); scanf("%d",&n); char before[11][11],after[11][11]; for(int i=0;i<n;i++) scanf("%s",before[i]); for(int i=0;i<n;i++) scanf("%s",after[i]); check(before,after); }