sdut oj 2372 Annoying painting tool(【暴力列挙試験】1 Y)

3368 ワード

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 1

010

101

010

4 3 2 1

011

110

011

110

3 4 2 2

0110

0111

0000

0 0 0 0

サンプル出力

4

6

-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
"); else printf("%d
", cnt ); } return 0; }