题意:给定一个01矩阵,要求从0矩阵变换得到该结果,变换的方法是把一个绝对r*c大小的方格内的元素改变(0变1,1变0)。最少多少步。
思路:实际上这个步数是确定的,而且数据范围比较小,长宽不到100,所以简单模拟即可。
#include <cstdio>
#include <cstring>
#define N 105
char s[N][N];
int t[N][N];
int n,m,a,b;
void change(int x,int y){
int i,j;
for(i = x;i<x+a;i++)
for(j = y;j<y+b;j++)
t[i][j] = !t[i][j];
}
int nice(){
int i,j;
for(i = 0;i<n;i++)
for(j = 0;j<m;j++)
if(s[i][j] != t[i][j])
return 0;
return 1;
}
int test(){
int i,j,res=0;
for(i = 0;i<=n-a;i++)
for(j = 0;j<=m-b;j++)
if(s[i][j] != t[i][j]){
res++;
change(i,j);
}
if(nice())
return res;
return -1;
}
int main(){
while(scanf("%d %d %d %d",&n,&m,&a,&b) && (n+m+a+b)){
int i,j;
char ch;
memset(t, 0, sizeof(t));
for(i = 0;i<n;i++){
getchar();
for(j = 0;j<m;j++){
ch = getchar();
if(ch == '0')
s[i][j] = 0;
else if(ch == '1')
s[i][j] = 1;
}
}
j = test();
if(j==-1)
printf("-1\n");
else
printf("%d\n",j);
}
return 0;
}