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;
}