#include <stdio.h>
int begin[100][100];
int end[100][100];
int temp[100][100];
int count = 0;
int changeLine(int x,int y,int n)
{
// printf("*");
for(int i = 0;i<y;i++ )
temp[n][i] = 1-temp[n][i];
count ++;
return 0;
}
int changeRow(int x,int y,int a,int b)
{
int tm;
if(a == b)
return 0;
// printf("#");
for(int i = 0;i<x ;i++)
{
tm = temp[i][a];
temp[i][a] = temp[i][b];
temp[i][b] = tm;
}
count++;
return 0;
}
int compareRow(int x,int f,int s)
{
for(int i = 0;i<x;i++)
if(temp[i][f]!=end[i][s])
return 0;
return 1;
}
int copy(int x,int y)
{
for(int i = 0 ;i<x;i++)
for(int j = 0; j<y ; j++)
temp[i][j]=begin[i][j];
return 0;
}
int main()
{
int x,y;
//x表示一共有多少行数据;
//y表示一共有多上列数据
while(~scanf("%d%d",&x,&y))
{
for(int i =0; i<x; i++)
for(int j = 0;j<y;j++)
scanf("%d",&begin[i][j]);
for(int i =0; i<x; i++)
for(int j = 0;j<y;j++)
scanf("%d",&end[i][j]);
int min =10000;
for(int k = 0;k < y ;k ++)
{
count = 0;
copy(x,y);
// for(int i =0; i<x; i++)
// {
// for(int j = 0;j<y;j++)
// printf("%d ",temp[i][j]);
// putchar('\n');
// }
changeRow(x,y,0,k);
for(int i=0;i<x;i++)
{
// printf("\n%d》》%d\n",temp[i][0],end[i][0]);
if(temp[i][0]!=end[i][0])
changeLine(x,y,i);
}
bool flag=false;
for(int i=1;i<y;i++)
{
flag = false;
for(int j = i;j<y;j++)
{
if(compareRow(x,j,i))
{
changeRow(x,y,j,i);
flag = true;
break;
}
}
if(flag == false)
break;
}
// printf("%d %d\n",count,flag);
if(min>count && flag)
min = count;
}
if(min<1000)
printf("the min foot is %d\n",min);
else
printf("-1");
}
return 0;
}
反转金币问题
最新推荐文章于 2021-08-23 21:33:35 发布