zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 71 (Rated for Div. 2) B

    原文链接: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 }
    大佬见笑,,
  • 相关阅读:
    [整理]Win下好用的Markdown工具
    tcpip http socket
    [整理].net中的延迟初始化器
    [整理]ASP.NET WEB API 2学习
    [整理]ASP.NET MVC 5
    [转载]AngularJS 指令 用法
    [整理]HTML5 WebSocket
    [整理]CSS3 滤镜
    [整理]WebAPP开发的框架
    [整理]AngularJS移动端开发遇到的问题
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/11404261.html
Copyright © 2011-2022 走看看