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 @   薛定谔的AC  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示