CodeForces 1983B Corner Twist

题目链接:CodeForces 1983B【Corner Twist】



思路

       可以发现操作一次,被操作位置的对应每一横行和每一纵行的加减数都是3,所以可以根据网格a和b的横纵状态确定是否通过操作使得网格a到达网格b。


代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e2 + 10;

int a[N][N], b[N][N];
int main() {
  int t;
  cin >> t;
  while (t--) {
    memset(a, 0, sizeof a);
    memset(b, 0, sizeof b);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
      string s;
      cin >> s;
      for (int j = 0; j < m; j++) {
        a[i][j + 1] = s[j] - '0';
        a[i][j + 1] = a[i][j + 1] + a[i - 1][j + 1] + a[i][j] - a[i - 1][j];
      }
    }
    
    for (int i = 1; i <= n; i++) {
      a[i][m + 1] = a[i][m] - a[i - 1][m];
    }
    for (int i = 1; i <= m; i++) {
      a[n + 1][i] = a[n][i] - a[n][i - 1];
    }

    for (int i = 1; i <= n; i++) {
      string s;
      cin >> s;
      for (int j = 0; j < m; j++) {
        b[i][j + 1] = s[j] - '0';
        b[i][j + 1] = b[i][j + 1] + b[i - 1][j + 1] + b[i][j] - b[i - 1][j];
      }
    }

    for (int i = 1; i <= n; i++) {
      b[i][m + 1] = b[i][m] - b[i - 1][m];
    }
    for (int i = 1; i <= m; i++) {
      b[n + 1][i] = b[n][i] - b[n][i - 1];
    }
    
    int flag = 0;
    for (int i = 1; i <= n; i++) {
      b[i][m + 1] = b[i][m] - b[i - 1][m];
      if ((b[i][m + 1] - a[i][m + 1]) % 3 != 0) {
        cout << "NO" << endl;
        flag = 1;
        break;
      }
    }

    if (flag) {
      continue;
    }

    for (int i = 1; i <= m; i++) {
      b[n + 1][i] = b[n][i] - b[n][i - 1];
      if ((b[n + 1][i] - a[n + 1][i]) % 3 != 0) {
        cout << "NO" << endl;
        flag = 1;
        break;
      }
    }

    if (flag) {
      continue;
    }

    cout << "YES" << endl;
  }
  
  return 0;
}
posted @ 2024-07-16 14:48  薛定谔的AC  阅读(13)  评论(0编辑  收藏  举报