RE on test #1求助
#include <bits/stdc++.h>
using namespace std;
#define i64 long long
#define int long long
const int N = 1e3 + 10;
const int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
struct Node {
int a, b;
} g[N][N];
int n, m, k, q, s;
int ans1, ans2, ans3, ans4, ans5;
int tmp[N][N], tp[N][N], vis[N][N], col[N][2], c[N], nowc[N];
void clear() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
tp[i][j] = tmp[i][j] = vis[i][j] = 0;
}
}
}
void clear_col() {
for (int i = 1; i <= 200; i++) {
col[i][0] = col[i][1] = 0;
}
}
void spl(int x, int y) {
if (x < 1 || x > n || y < 1 || y > m) {
return;
}
if (tmp[x][y] == -1) {
return;
}
tmp[x][y] = -1;
if (g[x][y].b == 1) {
for (int i = 1; i <= m; i++) {
spl(x, i);
}
} else if (g[x][y].b == 2) {
for (int i = 1; i <= n; i++) {
spl(i, y);
}
} else if (g[x][y].b == 3) {
for (int i = 1; i <= m; i++) {
spl(x, i);
}
for (int i = 1; i <= n; i++) {
spl(i, y);
}
} else if (g[x][y].b == 4) {
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
spl(i, j);
}
}
} else if (g[x][y].b == 5) {
for (int i = x - 2; i <= x + 2; i++) {
for (int j = y - 2; j <= y + 2; j++) {
spl(i, j);
}
}
} else if (g[x][y].b == 6) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j].a == g[x][y].a) {
spl(i, j);
}
}
}
}
}
void dfs(int x, int y) {
s++, vis[x][y] = 1;
for (int k = 0; k < 4; k++) {
int nx = x + dx[k], ny = y + dy[k];
if (nx < 1 || nx > n || ny < 1 || ny > m) {
continue;
}
if (tp[nx][ny] != -1 || g[nx][ny].a != g[x][y].a || vis[nx][ny]) {
continue;
}
dfs(nx, ny);
}
}
void solve() {
int lun = 0;
while (1) {
lun++;
clear();
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j >= 3 && g[i][j - 2].a != -1 && g[i][j - 2].a == g[i][j - 1].a && g[i][j - 1].a == g[i][j].a) {
cnt++;
tp[i][j - 2] = tp[i][j - 1] = tp[i][j] = -1;
for (int k = j - 2; k <= j; k++) {
spl(i, k);
}
} if (i >= 3 && g[i - 2][j].a != -1 && g[i - 2][j].a == g[i - 1][j].a && g[i - 1][j].a == g[i][j].a) {
cnt++;
tp[i - 2][j] = tp[i - 1][j] = tp[i][j] = -1;
for (int k = i - 2; k <= i; k++) {
spl(k, j);
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!vis[i][j] && tp[i][j] == -1) {
dfs(i, j);
ans3 += 50 * (s - 3) * (s - 3);
s = 0;
}
}
}
if (cnt == 0) {
break;
}
int sum = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (tmp[i][j] == -1 && g[i][j].a != -1) {
sum += g[i][j].a;
}
}
}
ans1 += lun * sum;
for (int j = 1; j <= m; j++) {
int p = 0;
for (int i = n; i >= 1; i--) {
if (tmp[i][j] == -1) {
p++;
} else {
g[i + p][j] = g[i][j];
}
}
for (int i = 1; i <= p; i++) {
g[i][j] = {-1, -1};
}
}
}
ans2 += 80 * (lun - 2) * (lun - 2);
}
bool find_col(int x) {
int p = (x - 1) % 5 + 1, tot = 0;
for (int i = 1; i <= k; i++) {
c[i] = false;
}
int sum = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j >= 3 && g[i][j - 2].a != -1 && g[i][j - 2].a == g[i][j - 1].a && g[i][j - 1].a == g[i][j].a) {
sum++;
if (!c[g[i][j].a]) {
c[g[i][j].a] = true;
col[p][++tot] = g[i][j].a;
}
}
if (i >= 3 && g[i - 2][j].a != -1 && g[i - 2][j].a == g[i - 1][j].a && g[i - 1][j].a == g[i][j].a) {
sum++;
if (!c[g[i][j].a]) {
c[g[i][j].a] = true;
col[p][++tot] = g[i][j].a;
}
}
}
}
return !sum;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> k >> q;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> g[i][j].a;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> g[i][j].b;
}
}
int cnt = 0;
bool all = true;
for (int Q = 1; Q <= q; Q++) {
int x, y, xx, yy;
cin >> x >> y >> xx >> yy;
if (abs(x - xx) + abs(y - yy) != 1 || g[x][y].a == -1 || g[xx][yy].a == -1) {
all = false;
continue;
}
swap(g[x][y], g[xx][yy]);
if (find_col(++cnt)) {
cnt--, all = false;
swap(g[x][y], g[xx][yy]);
continue;
}
if (cnt % 5 == 0) {
int ALL = (1 << 5) - 1;
int maxn = 0;
for (int a = 1; a <= 2; a++) {
for (int b = 1; b <= 2; b++) {
for (int c = 1; c <= 2; c++) {
for (int d = 1; d <= 2; d++) {
for (int e = 1; e <= 2; e++) {
nowc[1] = col[1][a], nowc[2] = col[2][b], nowc[3] = col[3][c], nowc[4] = col[4][d], nowc[5] = col[5][e];
if (!nowc[1] || !nowc[2] || !nowc[3] || !nowc[4] || !nowc[5]) {
continue;
}
set<int> s;
for (int i = 1; i <= 5; i++) {
s.insert(nowc[i]);
}
sort(nowc + 1, nowc + 6);
if (s.size() == 5) {
maxn = max(maxn, 50 + nowc[5]);
} else if (s.size() == 4) {
int p = 0;
for (int i = 2; i <= 5; i++) {
if (nowc[i] == nowc[i - 1]) {
p = i;
break;
}
}
maxn = max(maxn, 100 + nowc[p] * 2);
} else if (s.size() == 3) {
bool fg = false;
int p = 0;
for (int i = 3; i <= 5; i++) {
if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2]) {
fg = true, p = i;
break;
}
}
if (fg) {
maxn = max(maxn, 300 + nowc[p] * 3);
} else {
p = 0;
int pp = 0;
for (int i = 2; i <= 5; i++) {
if (nowc[i] == nowc[i - 1]) {
if (p) {
pp = i;
} else {
p = i;
}
}
}
maxn = max(maxn, 200 + nowc[pp] * 2 + nowc[p]);
}
} else if (s.size() == 2) {
bool fg = false;
int p = 0;
for (int i = 4; i <= 5; i++) {
if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2] && nowc[i - 2] == nowc[i - 3]) {
fg = true, p = i;
break;
}
}
if (fg) {
maxn = max(maxn, 750 + nowc[p] * 5);
} else {
p = 0;
int pp = 0;
for (int i = 3; i <= 5; i++) {
if (nowc[i] == nowc[i - 1] && nowc[i - 1] == nowc[i - 2]) {
p = i;
}
}
for (int i = 2; i <= 5; i++) {
if (nowc[i] != nowc[p] && nowc[i] == nowc[i - 1]) {
pp = i;
}
}
maxn = max(maxn, 500 + nowc[p] * 3 + nowc[pp]);
}
} else if (s.size() == 1) {
maxn = max(maxn, 1000 + nowc[1] * 10);
}
}
}
}
}
}
ans4 += maxn;
clear_col();
}
solve();
}
if (all) {
ans5 += 1000;
}
bool flg = true;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j].a != -1) {
flg = false;
break;
}
}
if (!flg) {
break;
}
}
if (flg) {
ans5 += 10000;
}
cout << ans1 + ans2 + ans3 + ans4 + ans5 << "\n";
return 0;
}