uva 12284 直接判断
思路:见代码
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define Maxn 110 using namespace std; int a[Maxn][Maxn],b[Maxn][Maxn],n,k; bool equel() { int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(a[i][j]!=b[i][j]) return false; } } return true; } bool symmic() { int i,j,cnt=0; for(i=1;i<=n;i++){ for(j=1;j<i;j++){ if(a[i][j]!=b[j][i]&&i!=j) return false; if((a[i][j]!=b[i][j]||a[j][i]!=b[j][i])&&b[j][i]!=b[i][j]){ cnt++; } } } if(cnt>1) return false; return true; } bool bb() { int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(b[i][j]!=b[j][i]) return false; } } return true; } bool aa() { int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(a[i][j]!=a[j][i]) return false; } } return true; } int getnum() { int i,j,num=0; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(a[i][j]!=b[i][j]) num++; } } return num; } int main() { int t,i,j,Ca=0; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); for(i=1;i<=n;i++){ for(j=1;j<=n;j++) scanf("%d",&a[i][j]); } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) scanf("%d",&b[i][j]); } printf("Case %d: ",++Ca); if(equel()){ printf("0\n"); continue; } if(bb()){ printf("-1\n"); continue; } int ans; ans=getnum(); if(symmic()){ if(k<=2&&n<=2){ printf("-1\n"); continue; } if(k==2) printf("%d\n",ans+2); else printf("%d\n",ans+1); continue; } printf("%d\n",ans); } return 0; }