首页 > 代码库 > sdut oj 2372 Annoying painting tool (【暴力枚举测试】1Y )

sdut oj 2372 Annoying painting tool (【暴力枚举测试】1Y )

Annoying painting tool

题目描述

Maybe you wonder what an annoying painting tool is? First of all, the painting tool we speak of supports only black and white. Therefore, a picture consists of a rectangular area of pixels, which are either black or white. Second, there is only one operation how to change the colour of pixels:

Select a rectangular area of r rows and c columns of pixels, which is completely inside the picture. As a result of the operation, each pixel inside the selected rectangle changes its colour (from black to white, or from white to black).

Initially, all pixels are white. To create a picture, the operation described above can be applied several times. Can you paint a certain picture which you have in mind?

输入

The input contains several test cases. Each test case starts with one line containing four integers n, m, r and c. (1 ≤ r ≤ n ≤ 100, 1 ≤ c ≤ m ≤ 100), The following nlines each describe one row of pixels of the painting you want to create. The ith line consists of m characters describing the desired pixel values of the ith row in the finished painting (\‘0\‘ indicates white, \‘1\‘ indicates black).

The last test case is followed by a line containing four zeros.

输出

For each test case, print the minimum number of operations needed to create the painting, or -1 if it is impossible.

示例输入

3 3 1 10101010104 3 2 10111100111103 4 2 20110011100000 0 0 0

示例输出

46-1

 代码:

#include <iostream>#include <string>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;int map[110][110];int n, m, r, c;bool judge(int dd, int ff){    if((dd+r-1)<=n && (ff+c-1)<=m )        return true;    else        return false;}void OP(int dd, int ff){    int i, j;    for(i=dd; i<=(dd+r-1); i++)    {        for(j=ff; j<=(ff+c-1); j++)        {            if(map[i][j]==1)                map[i][j]=0;            else                map[i][j]=1;        }    }}int main(){    int flag;    int i, j, k, e;    char s[110];    int cnt;    while(scanf("%d %d %d %d", &n, &m, &r, &c)!=EOF)    {        if(n==0&&m==0&&r==0&&c==0 )            break;        flag=1;        cnt=0;        for(i=1; i<=n; i++)        {            scanf("%s", s);            int len=strlen(s);            for(j=0; j<len; j++)                map[i][j+1]=s[j]-48;        }        for(i=1; i<=n; i++)        {            for(j=1; j<=m; j++)            {                if(map[i][j]==1)                {                    if(judge(i, j)==true)                    {                        OP(i, j); cnt++;                    }                    else                    {                        flag=0; break;                    }                }            }            if(flag==0) break;        }        if(flag==0)            printf("-1\n");        else            printf("%d\n", cnt );    }    return 0;}

 

sdut oj 2372 Annoying painting tool (【暴力枚举测试】1Y )