这个题目考察了二维数组行列之间的相互转化以及水平翻转和镜像转化。
一开始我想把每个情况写成一个函数,然后再根据情况决定调用哪一个。
程序是写出来了,但是不知道为什么有几种情况总是输出7。。。。
然后又上网查了查,发现了更好的方法。
错误代码:
#include<iostream> using namespace std; int n; char terb1[11][11],terb2[11][11]; int change1_3() { int i,j; int m=1; for(j=1;j<=n;j++){ for(i=n;i>=1;i--){ if(terb1[i][j]!=terb2[j][n-i+1]) { m=0; } } } if(m==1){ return 1; } for(i=n;i>0;i--){ for(j=n;j>0;j--){ if(terb1[i][j]!=terb2[n-i+1][n-j+1]) { m=1; } } } if(m==0){ return 2; } for(j=n;j>0;j--){ for(i=1;i<=n;i++){ if(terb1[i][j]!=terb2[n-j+1][i]) { m=0; } } } if(m==1){ return 3; } return 0; } int change4_5() { int m=0; int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(terb1[i][j]!=terb2[i][n-j+1]){ m=1; } } } if(m==0){ return 4; } char ch; for(i=1;i<=n;i++){ for(j=1;j<=n/2;j++){ ch=terb1[i][j]; terb1[i][j]=terb1[i][n-j+1]; terb1[i][n-j+1]=ch; } } if(change1_3()) {cout<<change1_3()<<endl;return 5;} else return 0; } int change6() { int i,j; int m=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(terb1[i][j]!=terb2[i][j]) m=1; if(m==0) return 6; return 0; } int main() { cin>>n; int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>terb1[i][j]; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>terb2[i][j]; if(change1_3()) cout<<change1_3(); else if(change4_5()) 1;//cout<<change4_5(); else if(change6()) cout<<6; else cout<<7; cout<<change4_5(); return 0; } //AC代码//
#include<iostream> #include<cstring> using namespace std; int main() { char a[11][11],b[11][11]; int i,j,n; int f[10]; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>a[i][j]; for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>b[i][j]; memset(f,0,sizeof(f)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(a[j][n-i+1]==b[i][j]) f[1]++; if(a[n-i+1][n-j+1]==b[i][j]) f[2]++; if(a[j][n-i+1]==b[i][j]) f[3]++; if(a[i][n-j+1]==b[i][j]) f[4]++; if(a[i][j]==b[i][j]) f[6]++; if(a[i][n-j+1]==b[j][n-i+1]) f[5]++; if(a[i][n+1-j]==b[n+1-i][n+1-j])f[7]++; if(a[i][n+1-j]==b[n+1-j][i])f[8]++; } for(i=1;i<=8;i++) { if(f[i]==n*n) { if(i<=6){ cout<<i; } else cout<<5; return 0; } } cout<<7; return 0; }