念力科技笔试

三连得分 给定⼀个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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值