【每日例题】蓝桥杯 c++ 小郑下五子棋

发布时间 2023-11-15 16:00:39作者: 山远尽成云

小郑下五子棋

题目

五子棋是—种两人对弈的棋类游戏,它使用黑白两种棋子在一个20×20的棋盘上进行。黑方执黑棋,白方执白棋。双方轮流下棋,目标是先在横向、纵向或斜向连成五个己颜色的棋子,即五子相连,即可获胜。五子棋是—种简单却富有策略的游戏,常常被用于智力训练和竞技比赛。这不,小郑在和小张玩五子棋,下到一半,小郑在某—次落子后,突然被爸妈喊去吃饭了,此时小郑或小张并没有获得五子棋的胜利。
吃完饭小郑回来发现,整个五子棋世界都变了。
小郑想知道小张有没有更改过棋盘,可是她已经想不起来他走之前棋盘是什么样子的了。
为了简化题目,你可以认为以下情况是小张作弊了。
1、小郑或小张已经获得了胜利。2、黑白子数数量之差大于1。
输入格式
输入数据包含20行,每行包含20个字符(格子),.表示该位置为空,。表示小郑的棋子,x表示小张的棋子。
输出格式
如果小张没有作弊,输出Yes,否则输出No。

思路分析

  需要进行两种条件判断,判断棋子之差是否大于1,这个只需要遍历棋盘上的棋子,然后计数即可;看有没有人已经获胜,即连成五子,这个可以用if语句进行判断,可以结合数组确定棋子位置即可。

  简单题直接暴力解法即可,但是有一个小点不确定是代码问题还是检验的数据挖的坑,由于棋盘为20×20,按道理用if语句进行判断五子是否连线时已经将其计算在内,但是需要拓展棋盘,将棋盘变为28×28才可通过该案例。

代码

#include <iostream>
using namespace std;
int main()
{
  char a[28][28];
  int countx=0,county=0;
  //补充棋盘输入案例未输入区域
  for(int i=0;i<28;i++)
  {
    for(int j=0;j<28;j++)
    {
        a[i][j]='.';
    }
  }
  //输入
  for(int i=4;i<24;i++)
  {
    for(int j=4;j<24;j++)
    {
        cin>>a[i][j];
    }
  }
  //黑白子之差大于1/获得胜利
  for(int i=4;i<24;i++)
  {
    for(int j=4;j<24;j++)
    {
      if(a[i][j]=='o')
      {
        if(a[i+1][j]=='o'&&a[i+2][j]=='o'&&a[i+3][j]=='o'&&a[i+4][j]=='o')//竖
        {
          cout<<"No";
          return 0;
        }
        if(a[i][j+1]=='o'&&a[i][j+2]=='o'&&a[i][j+3]=='o'&&a[i][j+4]=='o')//横
        {
          cout<<"No";
          return 0;
        }
        if(a[i+1][j-1]=='o'&&a[i+2][j-2]=='o'&&a[i+3][j-3]=='o'&&a[i+4][j-4]=='o')//斜
        {
          cout<<"No";
          return 0;
        }
        if(a[i+1][j+1]=='o'&&a[i+2][j+2]=='o'&&a[i+3][j+3]=='o'&&a[i+4][j+4]=='o')
        {
          cout<<"No";
          return 0;
        }
        countx++;
      }
      if(a[i][j]=='x')
      {
        if(a[i+1][j]=='x'&&a[i+2][j]=='x'&&a[i+3][j]=='x'&&a[i+4][j]=='x')//竖
        {
          cout<<"No";
          return 0;
        }
        if(a[i][j+1]=='x'&&a[i][j+2]=='x'&&a[i][j+3]=='x'&&a[i][j+4]=='x')//横
        {
          cout<<"No";
          return 0;
        }
        if(a[i+1][j-1]=='x'&&a[i+2][j-2]=='x'&&a[i+3][j-3]=='x'&&a[i+4][j-4]=='x')//斜
        {
          cout<<"No";
          return 0;
        }
        if(a[i+1][j+1]=='x'&&a[i+2][j+2]=='x'&&a[i+3][j+3]=='x'&&a[i+4][j+4]=='x')
        {
          cout<<"No";
          return 0;
        }
        county++;
      }
    }
  }
  if((countx-county>1)||(county-countx>1))
  {
    cout<<"No";
    return 0;
  }
  else
  {
    cout<<"Yes";
  }
  return 0;
}