小郑下五子棋
题目
五子棋是—种两人对弈的棋类游戏,它使用黑白两种棋子在一个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; }
标签:棋盘,20,28,五子棋,小张,蓝桥,棋子,例题 From: https://www.cnblogs.com/hcrzhi/p/17834057.html