求调!
黑白蜗蜗棋是一个非常有趣的双人对弈游戏,游戏在一个 n×n 的棋盘上进行,双方轮流落子,一方执黑棋,另一方执白棋,进行若干个回合,最后进行算分,计算规则如下:
若存在两个棋子满足:
记 bi,j 为棋盘上第 i 行第 j 列位置上的信息,若 bi,j 为 1 则表示这个位置上有一个黑棋,bi,j 为 2 则表示这个位置上有一个白棋,为 0 则表示没有落子。
现给出 m 个回合后棋盘的状态,请你计算双方的得分。
输入格式 第一行一个整数 n,表示矩阵的大小。
接下来 n 行,第 i 行 n 个整数 bi,1,bi,2,...,bi,n,其中 bi,j 表示棋盘第 i 行第 j 列位置上的信息。
保证棋盘上黑棋个数等于白棋个数或比白棋数量多 1。
输出格式 一行两个整数,分别表示黑棋方的得分和白棋方的得分。
4
1 2 1 0
2 1 2 0
1 2 1 0
0 0 0 0
4 2
b1,1 与 b1,3,b1,1 与 b3,1,b1,3 与 b3,3,b3,1 与 b3,3 之间均有一个白棋,故黑棋得分为 4。
b1,2 与 b3,2,b2,1 与 b2,3 之间均有一个黑棋,故白棋得分为 2。
4
1 0 0 1
2 1 0 2
1 2 1 1
2 2 2 1
3 2
b1,1 与 b1,4 中间没白棋,得 0 分, b1,1 与 b3,1,b3,1 与 b3,3,b1,4 与 b3,4 之间均有一个白棋,各得 1 分,故黑棋得分为 3。
b2,1 与 b2,4,b2,1 与 b4,1 之间均有一个黑棋,故得分为 2。
对于 60% 的数据,保证1≤n≤500;对于 100% 的数据,保证 1≤n≤3000。
蒟蒻的代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int b[3001][3001];
bool a[3001][3001], c[3001][3001];
int ans1, ans2;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &b[i][j]);
int an1 = 0, an2 = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ((a[i][j] && c[i][j]) || !b[i][j])
continue;
an1 = 0, an2 = 0;
if (!a[i][j]) {
for (int k = j + 1; k <= n; k++)
if (b[i][j] == b[i][k]) {
if (!a[i][k]) {
ans1 += an1;
ans2 += an2;
}
a[i][k] = 1;
continue;
}
else
if (b[i][k] != 0) {
if (b[i][j] == 1)
an1++;
else
an2++;
}
an1 = 0, an2 = 0;
for (int k = j - 1; k >= 1; k--)
if (b[i][j] == b[i][k]) {
if (!a[i][k]) {
ans1 += an1;
ans2 += an2;
}
a[i][j] = a[i][k] = 1;
continue;
}
else
if (b[i][k] != 0) {
if (b[i][j] == 1)
an1++;
else
an2++;
}
}
if (!c[i][j]) {
an1 = 0, an2 = 0;
for (int k = i + 1; k <= n; k++)
if (b[i][j] == b[k][j]) {
if (!c[k][j]) {
ans1 += an1;
ans2 += an2;
}
c[k][j] = 1;
continue;
}
else
if (b[k][j] != 0) {
if (b[i][j] == 1)
an1++;
else
an2++;
}
an1 = 0, an2 = 0;
for (int k = i - 1; k >= 1; k--)
if (b[i][j] == b[k][j]) {
if (!c[k][j]) {
ans1 += an1;
ans2 += an2;
}
c[i][j] = c[k][j] = 1;
continue;
}
else
if (b[k][j] != 0) {
if (b[i][j] == 1)
an1++;
else
an2++;
}
}
}
}
printf("%d %d", ans1, ans2);
}