UVA 12284 Digital Matrix
思路:这个分清楚情况就很好做了。
注意一点当A的转置等于B的时候(对角线除外),记录A的下三角(或上三角)有cnt个的数与B不同,如果cnt>1则
不需要额外的步数就可以了,否则当k==2时结果要加2,反之加1.
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #define M 105 4 using namespace std; 5 int a[M][M],b[M][M],n; 6 bool is() 7 { 8 for(int i=0;i<n;i++) 9 for(int j=0;j<i;j++) 10 if(b[i][j]!=b[j][i]) return 0; 11 return 1; 12 } 13 bool ab() 14 { 15 int cnt=0; 16 for(int i=0;i<n;i++) 17 for(int j=0;j<i;j++){ 18 if(a[i][j]!=b[j][i]||a[j][i]!=b[i][j]) return 0; 19 if((a[i][j]!=b[i][j]||a[j][i]!=b[j][i])&&b[i][j]!=b[j][i]) cnt++; 20 } 21 if(cnt>1) return 0; 22 return 1; 23 } 24 int main() 25 { 26 int t,ca=0,k; 27 scanf("%d",&t); 28 while(t--){ 29 scanf("%d%d",&n,&k); 30 for(int i=0;i<n;i++) 31 for(int j=0;j<n;j++) 32 scanf("%d",&a[i][j]); 33 int ans=0; 34 for(int i=0;i<n;i++) 35 for(int j=0;j<n;j++){ 36 scanf("%d",&b[i][j]); 37 ans+=(a[i][j]!=b[i][j]); 38 } 39 printf("Case %d: ",++ca); 40 if(!ans) printf("0\n"); 41 else if(is()) printf("-1\n"); 42 else if(ab()){ 43 if(k==2&&n==2) printf("-1\n"); 44 else if(k==2) printf("%d\n",ans+2); 45 else printf("%d\n",ans+1); 46 } 47 else printf("%d\n",ans); 48 } 49 }