题解:P11975 [KTSC 2021] 翻牌游戏 / card
__Confringo__ · · 题解
题目传送门
题目大意 作者看了好久才弄明白
给定一个初始全为 X 的
翻转操作规则:
每次选择一行或一列,并选择一个整数
如果选择行
如果选择列
发现翻转操作具有模
每个子网格
对于每个子网格
其他点
其中 X 为 0,O 为 1)。
若不满足该条件,则无法通过翻转操作得到目标图案。
遍历所有可能的余数对
对于每个
检查该子网格是否满足基准点约束,若任意子网格不满足,则直接返回 false。
可以直接以步长 false。
代码
#include <bits/stdc++.h>
using namespace std;
bool reversal(int N,int M,vector<string> P){
for (int a = 0;a < M;a++){
for (int b = 0;b < M;b++){
vector<int> r;
for (int i = b;i < N;i += M) r.push_back(i);
if (r.empty()) continue;
vector<int> c;
for (int j = a;j < N;j += M) c.push_back(j);
if (c.empty()) continue;
int ii = r[0],jj = c[0];
int ba = (P[ii][jj] == 'O');
for (int i : r){
for (int j : c){
int rv = (P[ii][j] == 'O');
int cv = (P[i][jj] == 'O');
if ((P[i][j] == 'O') != ba ^ rv ^ cv) return false;
}
}
}
}
return true;
}
// int main()
// {
// int n,m;
// string str;
// vector<string> p;
// cin >> n >> m;
// for (int i = 1;i <= n;i++){
// cin >> str;
// p.push_back(str);
// }
// cout << reversal(n,m,p) << endl;
// system("pause");
// return 0;
// }
怎么这道题都那么久了还没有人写题解?