题目说明
NowCoder最近爱上了五子棋,现在给你一个棋局,请你帮忙判断其中有没有五子连珠(超过五颗也算)。
输入描述:
输入有多组数据,每组数据为一张20x20的棋盘。
其中黑子用“*”表示,白子用“+”表示,空白位置用“.”表示。
输出描述:
如果棋盘上存在五子连珠(无论哪种颜色的棋子),输入“Yes”,否则输出“No”。
示例:
输入:
....................
....................
....................
....................
......*.............
.......*............
........*...........
....++++.*..........
..........*.........
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
.......*............
......+*+++.........
.......*............
.......*............
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
输出:
Yes
No
五子棋赢的规则:如果当前位置有连在一起的五颗棋子为同一种,则为赢。每取一个位置,检测该位置上、下、左、右以及对角线为是否为同一种棋子,是输出YES,不是则获取下一个位置继续检测,如果棋盘中没有连在一起的五颗棋子则输出NO。
dir代表当前位置的8个方向,其中上下、左右、左上右下、右上左下必须放在一起检测。获取一个棋盘,按照行列检测棋盘中的每个位置,当拿到一个位置后,按照以下步骤进行操作:
1.以该位置为中心,依次检测该位置的上下、左右、左上右下、右上左下
2.从该位置开始向上检测,找出连在一起的同种棋子个数,再向下检测同种棋子的个数并累计,注意在检测时,中心位置统计了两次,上下统计完时,需要给结果减去1
3.按照2统计完上下、左右、左上右下、右上左下各个方向,找出最大的同种棋子个数
4.检测3中统计出的最大同种棋子个数,如果大于等于5,输出YSE,否则取下一个位置继续1
5.如果所有的位置检测完,没有超过5个的相同棋子,则输出NO
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int blackwhite(string table[], char ch, int x, int y)
{
int maxc = 0;
int dir[4][2][2] = {
{
{
-1,0 },{
1,0 }},{
{
0,-1 },{
0,1 }},{
{
-1,