社区讨论

求调

灌水区参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lr3a9umw
此快照首次捕获于
2024/01/07 17:20
2 年前
此快照最后确认于
2024/01/07 20:07
2 年前
查看原帖
求调!
黑白蜗蜗棋是一个非常有趣的双人对弈游戏,游戏在一个 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。
输出格式 一行两个整数,分别表示黑棋方的得分和白棋方的得分。

样例输入1

4
1 2 1 0
2 1 2 0
1 2 1 0
0 0 0 0

样例输出1

4 2

样例解释1

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。

样例输入2

4
1 0 0 1
2 1 0 2
1 2 1 1
2 2 2 1

样例输出2

3 2

样例解释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。
蒟蒻的代码:
CPP
#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);
} 

回复

6 条回复,欢迎继续交流。

正在加载回复...