Educational Codeforces Round 71 (Rated for Div. 2) B - Square Filling

原文链接:https://www.cnblogs.com/xwl3109377858/p/11404261.html

Educational Codeforces Round 71 (Rated for Div. 2)

B - Square Filling

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

input

3 3

1 1 1

1 1 1

0 1 1

output

3

1 1

1 2

2 2

input

3 3

1 0 1

1 0 1

0 0 0

output

-1

input

3 2

0 0

0 0

0 0

output

0

Note

The sequence of operations in the first example:

000       110        111        111

000  →  110  →    111  →  111

000       000        000       011

题意:题目意思是给你一个由0,1组成的矩阵和一个空白矩阵,

你可以对空白矩阵进行操作,选择一个点,为左上点,使其2*2矩阵被1覆盖,

问你能不能把空白矩阵变成所给矩阵。

思路:先根据原矩阵中的0,标记矩阵中不能改变的几个点(为2*2矩阵,该0点为右下点),

最后用1矩阵把没有标记的点覆盖,看两个矩阵是否一样。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<map>
  7 #include<set>
  8 #include<vector>
  9 #include<queue>
 10 #include<stack>
 11 #include<list>
 12 //#include<unordered_map>
 13 using namespace std;
 14 #define ll long long 
 15 const int mod=1e9+7;
 16 const long long int inf=1e18+7;
 17 
 18 const int maxn=105;
 19 
 20 int a[maxn][maxn];
 21 
 22 int b[maxn][maxn];
 23 
 24 int book[maxn][maxn];
 25 
 26 int n,m;
 27 
 28 inline bool check(int x,int y)
 29 {
 30     if(x<1||x>n||y<1||y>m)
 31         return false;
 32     return true;
 33 }
 34 
 35 int main()
 36 {
 37     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
 38     
 39     while(cin>>n>>m)
 40     {
 41         memset(a,0,sizeof(a));
 42         memset(b,0,sizeof(b));
 43         memset(book,0,sizeof(book));
 44         
 45         for(int i=1;i<=n;i++)
 46         {
 47             for(int j=1;j<=m;j++)
 48             {
 49                 cin>>a[i][j];
 50             }
 51         }
 52         
 53         for(int i=1;i<=n;i++)
 54         {
 55             for(int j=1;j<=m;j++)
 56             {
 57                 if(a[i][j]==0)
 58                 {
 59                     book[i][j]=1;//这个点不能动
 60                     
 61                     if(check(i-1,j-1))
 62                         book[i-1][j-1]=1;
 63                     if(check(i-1,j))
 64                         book[i-1][j]=1;
 65                     if(check(i,j-1))
 66                         book[i][j-1]=1;    
 67                 }
 68             }
 69         }
 70         vector<pair<int,int> >v;
 71         
 72         for(int i=1;i<n;i++)//取2*2矩阵,边界无法取 
 73         {
 74             for(int j=1;j<m;j++)
 75             {
 76                 if(book[i][j]==0)//可以动
 77                 {
 78                     v.push_back(make_pair(i,j));
 79                     b[i][j]=1;
 80                     b[i+1][j]=1;
 81                     b[i][j+1]=1;
 82                     b[i+1][j+1]=1;
 83                  } 
 84             }
 85         }
 86         
 87         int flag=0;
 88         
 89         for(int i=1;i<=n;i++)
 90         {
 91             for(int j=1;j<=m;j++)
 92             {
 93                 if(a[i][j]!=b[i][j])
 94                 {
 95                     flag=1;
 96                     break;
 97                 }
 98             }
 99         }
100         
101         if(flag)
102             cout<<-1<<endl;
103         else
104         {
105             cout<<v.size()<<endl;
106             for(int i=0;i<v.size();i++)
107                 cout<<v[i].first<<" "<<v[i].second<<endl;
108         }
109         
110     }
111     
112     return 0;
113 }

猜你喜欢

转载自www.cnblogs.com/xwl3109377858/p/11404261.html