三连得分 给定⼀个10×10的棋盘,上⾯有两个玩家玩棋盘游戏的局⾯。其中玩家A的棋⼦⽤O表⽰,玩家B的棋 ⼦⽤X表⽰。请计算这个局⾯下两个玩家的得分。 得分计算规则如下:
1. 如果有三个相同棋⼦在连续相邻的格⼦上,称为三连,计⼀分。
2. 相邻是包括横竖斜⽅向上的相邻。
3. 两组三连只要不完全重复,可以分别计⼀分。 以下图为例:
对于玩家A(棋⼦是O):
4. 横着的三连总共有4组,如图所⽰:
第⼀⾏三连计1分, 第⼆⾏有连续4个棋⼦相邻,可以拆分出两组三连,各计1分共2分。 第三⾏三连计1分。
5. 竖着的三连共4组,和横着的情况类似
6. 斜着的三连共3组,如图所⽰:
所以玩家A的总分是4+4+3=11 对于玩家B(棋⼦是X):没有任何3个棋⼦是连续相邻的,所以总得分是0 输⼊:10×10的棋盘局⾯,玩家A棋⼦是O,玩家B棋⼦是X,空地⽤"."表⽰ 输出:两⾏,第⼀⾏是玩家A得分,第⼆⾏是玩家B得分 样例输⼊ Plain Text ........XX X....X.... ......X... ...OOO.... ...OOOOX.. ...OOO.... ....O..... .X....X.X. ........X. .......... 1 2 3 4 5 6 7 8 9 10 样例输出 11 0
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[10][10]={0};
int resa=0,resb=0;
void dfsa(int i, int j) {
if (i <= 7) {
if (a[i][j] == 1 && a[i + 1][j] == 1 && a[i + 2][j] == 1) {
resa++;
}
}
if (j <= 7) {
if (a[i][j] == 1 && a[i ][j+1] == 1 && a[i ][j+2] == 1) {
resa++;
}
}
if (i <= 7 && j <= 7) {
if (a[i][j] == 1 && a[i+1][j + 1] == 1 && a[i+2][j + 2] == 1) {
resa++;
}
}
if (i >= 3 && j >= 3) {
if (a[i][j] == 1 && a[i - 1][j + 1] == 1 && a[i - 2][j + 2] == 1) {
resa++;
}
}
}
void dfsb(int i, int j) {
if (i <= 7) {
if (a[i][j] == 2 && a[i + 1][j] == 2 && a[i + 2][j] == 2) {
resb++;
}
}
if (j <= 7) {
if (a[i][j] == 2 && a[i][j + 1] == 2 && a[i][j + 2] == 2) {
resb++;
}
}
if (i <= 7 && j <= 7) {
if (a[i][j] == 2 && a[i + 1][j + 1] == 2 && a[i + 2][j + 2] == 2) {
resb++;
}
}
if (i >= 3 && j >= 3) {
if (a[i][j] == 2 && a[i - 1][j + 1] == 2 && a[i - 2][j + 2] == 2) {
resb++;
}
}
}
int main() {
char x;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cin >> x;
if (x == '.') {
a[i][j] = 0;
}
else if (x == 'X') {
a[i][j] = 2;
}else if(x == 'O') {
a[i][j] = 1;
}
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (a[i][j] == 0) {
continue;
}
if (a[i][j] == 1) {
dfsa(i, j);
}
if (a[i][j] == 2) {
dfsb(i, j);
}
}
}
cout << resa << endl << resb;
return 0;
}