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
");
41         else if(is()) printf("-1
");
42         else if(ab()){
43             if(k==2&&n==2) printf("-1
");
44             else if(k==2) printf("%d
",ans+2);
45             else printf("%d
",ans+1);
46         }
47         else printf("%d
",ans);
48     }
49 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3352444.html