【每日例题】蓝桥杯 c++ 小郑下五子棋
小郑下五子棋
题目
五子棋是—种两人对弈的棋类游戏,它使用黑白两种棋子在一个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;
}

浙公网安备 33010602011771号