//trans.cpp郁闷测试老是超时,运行效率不合格
#include <iostream.h>
#include <fstream.h>
#define MAXN 100
int flag[MAXN] ={0};
int cflag[MAXN] ={0};
int rflag[MAXN] ={0};
int sa[MAXN][MAXN]={0};
int da[MAXN][MAXN]={0};
int ta[MAXN][MAXN]={0};
int ac=0;//数据组数
int rc=0;//行数
int cc=0;//列数
int r=-1;
int countTrans();
void switchArray();
int compare(int rowNo,int rf);
void trans(int s);
void main(){
int ai,i,j;
int * result;
ifstream infile("input.txt");
ofstream outfile("output.txt");
infile>>ac;
result=new int[ac];
for(ai=0;ai<ac;ai++){
result[ai]=-1;
r=-1;
infile>>rc;
infile>>cc;
//初始化源数组
for(i=0;i<rc;i++){
for(j=0;j<cc;j++){
infile>>sa[i][j];
}
}
//初始化目标数组
for(i=0;i<rc;i++){
for(j=0;j<cc;j++){
infile>>da[i][j];
}
}
trans(0);
result[ai]=r;
}
for(i=0;i<ac;i++){
cout<<result[i]<<endl;
outfile << result[i]<<endl;
}
//释放结果空间
delete result;
infile.close();
outfile.close();
}
void trans(int k){
int revc=0;//翻转次数
int exc=0;//换列次数
int i;
//int j;
bool f=false;
if(k==cc){
switchArray();
revc=0;
exc=0;
for(i=0;i<rc;i++){
if((-1==compare(i,0))&& (-1==compare(i,1))){
f=true;
break;
}else if(1==compare(i,1)){
revc++;
}
}
if(!f){
exc=countTrans();
if(r>=0){
if(revc+exc<r)r=revc+exc;
}else{
r=revc+exc;
}
}
return;
}
for(i=0;i<cc;i++) {
if(flag[i])
continue;
flag[i]=1;
cflag[k]=i;
trans(k+1);
flag[i]=0;
}
}
int compare(int rowNo,int rf){
int rt=1;
int j;
if(0==rf){
for(j=0;j<cc;j++){
if(sa[rowNo][cflag[j]]!=da[rowNo][j]){
//if(ta[rowNo][j]!=da[rowNo][j]){
rt=-1;
break;
}
}
}
else if(1==rf){
for(j=0;j<cc;j++){
if((sa[rowNo][cflag[j]]+1)%2!=da[rowNo][j]){
//if((ta[rowNo][j]+1)%2!=da[rowNo][j]){
rt=-1;
break;
}
}
}else{
rt=-1;
}
return rt;
}
int countTrans(){
int rt=0;
for(int i=0;i<cc;i++){
if(cflag[i]>i)rt++;
}
return rt;
}
void switchArray(){
int i,j;
for(i=0;i<rc;i++){
for(j=0;j<cc;j++){
ta[i][j]=sa[i][cflag[j]];
}
}
}