[擂台]中国象棋中规则检查的算法(卒,兵)
写一个检查中国卒棋走棋是否符合规则的算法。先只写如何检查“卒“的规则,检查包括黑白方的“卒“。
已经有了一些定义,如下:
enum ECChess //棋子的编码em_R表示红棋,后面跟拼音。
{
em_NoChess = 0x00,
em_RMin = 0x11,
em_RJu = 0x11,
em_RMa = 0x12,
em_RXiang = 0x13,
em_RShi = 0x14,
em_RShuai = 0x15,
em_RPao = 0x16,
em_RBing = 0x17,
em_RMax = 0x17,
em_BMin = 0x21,
em_BJu = 0x21,
em_BMa = 0x22,
em_BXiang = 0x23,
em_BShi = 0x24,
em_BJiang = 0x25,
em_BPao = 0x26,
em_BZhu = 0x27,
em_BMax = 0x27
};
struct CStep //定义了棋步的起止点。
{
unsigned char from,to;
};
棋盘的定义:
class CChessboard
{
enum EChessboard
{
em_SizeX = 10;
em_SizeY = 9;
};
#define BOARDSIZE (em_SizeX * em_SizeY)
unsigned char cells_[BOARDSIZE]; //棋盘格
......
public:
EChessResult Go(CStep);
......
private:
bool Check(CStep);
};
现在要求在check中检查走棋是否符合中国卒棋规则。
bool CChessboard::Check(CStep s)
要求:
时间和空间综合效率最高者独得100分,要完整的函数,符合规则返回true。效率主要考虑时间,空间效率只要不过分奢侈即可。
另外,我卒对其它的棋子开新贴子,都是100分的贴。有兴趣的可以关注。
补充说明:
棋盘按照自己方是红方,左下角坐标为(0,0),右上角是(9,8)来安排坐标;
按行存储,棋子(i,j)在cells_中的位置为i*em_SizeX + j;