Square Filling(greedy)

冷暖自知 提交于 2019-11-29 12:27:52

You are given two matrices A and B. Each matrix contains exactly n rows and m columns. Each element of A is either 0 or 1; each element of B is initially 0.

You may perform some operations with matrix B. During each operation, you choose any submatrix of B having size 2×2, and replace every element in the chosen submatrix with 1. In other words, you choose two integers x and y such that 1≤x<n and 1≤y<m, and then set Bx,y, Bx,y+1, Bx+1,y and Bx+1,y+1 to 1.

Your goal is to make matrix B equal to matrix A. Two matrices A and B are equal if and only if every element of matrix A is equal to the corresponding element of matrix B.

Is it possible to make these matrices equal? If it is, you have to come up with a sequence of operations that makes B equal to A. Note that you don’t have to minimize the number of operations.

Input
The first line contains two integers n and m (2≤n,m≤50).

Then n lines follow, each containing m integers. The j-th integer in the i-th line is Ai,j. Each integer is either 0 or 1.

Output
If it is impossible to make B equal to A, print one integer −1.

Otherwise, print any sequence of operations that transforms B into A in the following format: the first line should contain one integer k — the number of operations, and then k lines should follow, each line containing two integers x and y for the corresponding operation (set Bx,y, Bx,y+1, Bx+1,y and Bx+1,y+1 to 1). The condition 0≤k≤2500 should hold.

Examples
inputCopy
3 3
1 1 1
1 1 1
0 1 1
outputCopy
3
1 1
1 2
2 2
inputCopy
3 3
1 0 1
1 0 1
0 0 0
outputCopy
-1
inputCopy
3 2
0 0
0 0
0 0
outputCopy
0
Note
The sequence of operations in the first example:

000000000→110110000→110110110→110111111
题意: 二维矩阵a,b。a矩阵全是0,你每次可以在a里面指定一个2x2的矩阵全部赋为1。问能否使得a矩阵等于b矩阵
这道题一开始我是在a矩阵里面贪心的,用了4层循环…显然过不了。。。然后看了博客,结果是在b里面贪心emmmm,懂了;
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int a[55][55],b[55][55];
vector<pair<int,int> >niubi;
int main()
{
    int n,m;scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    for(int i = 1;i < n;i++)
    {
        for(int j = 1;j < m;j++)
        {
            if(a[i + 1][j + 1] == 1 && a[i][j] == 1 && a[i + 1][j] == 1 && a[i][j + 1] == 1)
            {
                niubi.push_back(make_pair(i,j));
            }
        }
    }
    
    for(int i = 0;i < niubi.size();i++)
    {
        int x = niubi[i].first;int y = niubi[i].second;
        b[x][y] = 1;b[x + 1][y + 1] = 1;b[x + 1][y] = 1;b[x][y + 1] = 1;
    }
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            if(b[i][j] != a[i][j])
            {
                printf("-1\n");
                return 0;
            }
        }
    }
    
    printf("%d\n",niubi.size());
    for(int i = 0;i < niubi.size();i++)
    {
        printf("%d %d\n",niubi[i].first,niubi[i].second);
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!