题目
你的任务是模拟黑白棋游戏的进程。黑白棋的规则为:黑白双方轮流放棋子,每次必 须让新放的棋子“夹住”至少一枚对方棋子,然后把所有被新放棋子“夹住”的对方棋子 替换成己方棋子。一段连续(横、竖或者斜向)的同色棋子被“夹住”的条件是两端都是 对方棋子(不能是空位)。如图所示,白棋有6个合法操作,分别为(2,3),(3,3),(3,5),(6,2),(7,3),(7,4)。选择在(7,3)放白棋后变成如图所示效果(注意有竖向和斜向的共两枚黑棋变白)。注意(4,6)的黑色棋子虽然被夹住,但不是被新放的棋子夹住,因此不变白。
输入一个8*8的棋盘以及当前下一次操作的游戏者,处理3种指令:
L指令打印所有合法操作,从左到右的顺序排列(无合法操作时输出No legal move)。
Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。保证输入合法。输出操作后的黑白棋子总数。
Q指令退出游戏,并打印当前棋盘(同输入格式)。
思路
这题可以说难也可以说不难。解题思路并不难,用暴力求解就好了。但中间有很多坑,而且有八个方向。
- 用八个函数实现八个方向的判定,函数同时具有两个功能:算出合法操作和夹住吃子操作。算出合法操作是基本操作,用一个指针判断是否要进行夹住吃子操作。
- 要注意棋盘边缘的判定和切换游戏者后是否有合法操作,也就是是否是死局的操作。
代码
#include <iostream>
#include <string>
using namespace std;
int search_jplus(char board[][9],int i,int j,char player,int q); //吃子操作判定指针q
int search_jsub(char board[][9],int i,int j,char player,int q);
int search_iplus(char board[][9],int i,int j,char player,int q);
int search_isub(char board[][9],int i,int j,char player,int q);
int search_ipjp(char board[][9],int i,int j,char player,int q);
int search_ipjs(char board[][9],int i,int j,char player,int q);
int search_isjp(char board[][9],int i,int j,char player,int q);
int search_isjs(char board[][9],int i,int j,char player,int q);
int main()
{
char board[9][9];
string ins;
char player;
int x,y;
for(int i=1;i<9;i++)
for(int j=1;j<9;j++)
cin>>board[i][j];
cout<<"Please enter player:";
cin>>player;
while(true)
{
cin>>ins;
if(ins[0]=='L')
{
int k=0;
for(int i=1;i<9;i++)
for(int j=1;j<9;j++)
{
int p,q;
p=q=0; //判断是否有合法操作指针p
if(board[i][j]=='-')
{
p=search_jplus(board,i,j,player,q);
if(p==1)
{
cout<<"("<<i<<","<<j<<")"<<endl;
k++;
continue;
}
p=search_jsub(board,i,j,player,q);
if(p==1)
{
cout<<"("<<i<<","<<j<<")"<<endl;
k++;
continue;
}
p=search_iplus(board,i,j,player,q);
if(p==1)
{
cout<<"("<<i<<