#include <iostream>
#include <cstring>
#include<stack>
#include<queue>
using namespace std;
// 声明一个结构体类型 Node表示棋子,属性为x,y坐标
struct Node
{
int x; //横坐标
int y; //纵坐标
};
struct NodeStep
{
Node ndstt; //起点
Node ndend; //终点
Node ndeat; //吃子
int seq;
};
typedef stack<NodeStep> StepStack; //走法栈
typedef deque<NodeStep> StepQueue; //走法队列
typedef queue<StepQueue> QStepQueue; //走法队列的队列,用于保存候选招法或是移动走法
//常量二维数组, 其中和棋盘格对应坐标存储的是编号1到50
int NOArray[10][10] = { {0,1,0,2,0,3,0,4,0,5},
{6,0,7,0,8,0,9,0,10,0},
{0,11,0,12,0,13,0,14,0,15},
{16,0,17,0,18,0,19,0,20,0},
{0,21,0,22,0,23,0,24,0,25},
{26,0,27,0,28,0,29,0,30,0},
{0,31,0,32,0,33,0,34,0,35},
{36,0,37,0,38,0,39,0,40,0},
{0,41,0,42,0,43,0,44,0,45},
{46,0,47,0,48,0,49,0,50,0} };
//棋子数据,其中保存四种类型的值:0:空,1:白兵,2:白王,3:黑棋子
int ChessArray[10][10] = { {0,1,0,1,0,1,0,1,0,1},
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,0,0,0,1,0,1,0,1,0},
{0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,2,0,0,0,0,0},
{0,2,0,0,0,2,0,2,0,2},
{2,0,2,0,2,0,2,0,2,0},
{0,2,0,2,0,2,0,2,0,2},
{2,0,2,0,2,0,2,0,2,0}, };
//吃子状态二维数组,二值数组,只能有真和假两个状态,初始为0
int HoldArray[10][10] = { 0 };
//这里的分析只针对吃子,nd为要分析的节点
bool AnalyseNode(Node nd, StepStack &stacktmp,int seq)
{
//hasfound为二值变量,为真表示找到了对于当前节点的吃子走法
bool hasfound = false;
//这两个数组可用于标示方位
int xd[] = { -1,1,-1,1 };
int yd[] = { -1,-1,1,1 };
NodeStep ndstep;
if (ChessArray[nd.x][nd.y] == 1)
{
//分别对左上,左下,右上,右下判断,如果可吃子,压入节点栈
for (int i = 0; i < 4; i++)
{
if ((nd.x + 2 * xd[i]) > -1 and (nd.x + 2 * xd[i]) < 10 and (nd.y + 2 * yd[i]) > -1 and (nd.y + 2 * yd[i]) < 10)
{
if (ChessArray[nd.x + 2 * xd[i]][nd.y + 2 * yd[i]] == 0 and ChessArray[nd.x + xd[i]][nd.y + yd[i]] == 3 and HoldArray[nd.x + xd[i]][nd.y + yd[i]] == 0)
{
ndstep.ndstt.x = nd.x;
ndstep.ndstt.y = nd.y;
ndstep.ndend.x = nd.x + 2 * xd[i];
ndstep.ndend.y = nd.y + 2 * yd[i];
ndstep.ndeat.x = nd.x + xd[i];
ndstep.ndeat.y = nd.y + yd[i];
ndstep.seq = seq;
stacktmp.push(ndstep);
hasfound = true;
}
}
}
}
else if (ChessArray[nd.x][nd.y] == 2)
{
Node ndtmp;
//分别对左上,左下,右上,右下判断,如果可吃子,压入走法栈
for (int i = 0; i < 4; i++)
{
ndtmp.x = nd.x+xd[i];
ndtmp.y = nd.y+yd[i];
//定义状态变量canloc表示是否可以落子,初始为false;
bool canloc = false;
//将起始位置记录在步法ndstep中
ndstep.ndstt.x = nd.x;
ndstep.ndstt.y = nd.y;
//先跳过空格
while (ndtmp.x > -1 and ndtmp.x<10 and ndtmp.y>-1 and ndtmp.y < 10)
{
if (ChessArray[ndtmp.x][ndtmp.y] == 0)
{
ndtmp.x += xd[i];
ndtmp.y += yd[i];
continue;
}
if (ChessArray[ndtmp.x][ndtmp.y] == 1 or ChessArray[ndtmp.x][ndtmp.y] == 2)
break;
if (ChessArray[ndtmp.x][ndtmp.y] == 3 and HoldArray[ndtmp.x][ndtmp.y] == 0)
{
ndstep.ndeat.x = ndtmp.x;
ndstep.ndeat.y = ndtmp.y;
canloc = true;
ndtmp.x += xd[i], ndtmp.y += yd[i];
break;
}
else
break;
}
if (canloc)
{
//在跳过对方一个棋子后,所有空格都是可行步,如果其后的棋子不为空或者
//超出边界,不会将该走法压入走法栈
while (ndtmp.x > -1 and ndtmp.x<10 and ndtmp.y>-1 and ndtmp.y < 10)
{
if (ChessArray[ndtmp.x][ndtmp.y] == 0)
{
ndstep.ndend.x = ndtmp.x;
ndstep.ndend.y = ndtmp.y;
stacktmp.push(ndstep);
hasfound = true;
ndtmp.x += xd[i];
ndtmp.y += yd[i];
}
else
break;
}
}
}
}
return hasfound;
}
//无子可吃时,将不吃子走法压入栈
void Move(Node nd, StepQueue &stacktmp)
{
//这两个数组可用于标示方位
int xd[] = { -1,1,-1,1 };
int yd[] = { -1,-1,1,1 };
NodeStep ndstep;
if (ChessArray[nd.x][nd.y] == 1)
{
//分别对左上,左下,右上,右下判断,如果为空,压入节点栈
for (int i = 0; i < 4; i+=2)
{
if ((nd.x + xd[i]) > -1 and (nd.x + xd[i]) < 10 and (nd.y + yd[i]) > -1 and (nd.y + yd[i]) < 10)
{
if (ChessArray[nd.x + xd[i]][nd.y + yd[i]] == 0)
{
ndstep.ndstt.x = nd.x;
ndstep.ndstt.y = nd.y;
ndstep.ndend.x = nd.x + xd[i];
ndstep.ndend.y = nd.y + yd[i];
stacktmp.push_back(ndstep);
}
}
}
}
else if (ChessArray[nd.x][nd.y] == 2)
{
Node ndtmp;
//分别对左上,左下,右上,右下判断,如果为空,压入走法栈
for (int i = 0; i < 4; i++)
{
ndtmp.x = nd.x + xd[i];
ndtmp.y = nd.y + yd[i];
//将起始位置记录在步法ndstep中
ndstep.ndstt.x = nd.x;
ndstep.ndstt.y = nd.y;
//为空格时压入栈
while (ndtmp.x > -1 and ndtmp.x<10 and ndtmp.y>-1 and ndtmp.y < 10)
{
if (ChessArray[ndtmp.x][ndtmp.y] == 0)
{
ndstep.ndend.x = ndtmp.x;
ndstep.ndend.y = ndtmp.y;
stacktmp.push_back(ndstep);
ndtmp.x += xd[i];
ndtmp.y += yd[i];
continue;
}
else
break;
}
}
}
}
//主函数
int main()
{
QStepQueue ways_eat; //保存候选招法和移动走法的变量
StepQueue ways_move;
StepStack stepwait; //未完成走法栈
StepQueue stepfinish; //已完成走法队列
Node nodecur; //定义当前节点变量
NodeStep stepcur; //定义当前走法
int n = 0;
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 10; y++)
{
if (ChessArray[x][y] == 1 or ChessArray[x][y] == 2)
{
//为根节点赋值
nodecur.x = x;
nodecur.y = y;
//清空栈和队列
while (!stepwait.empty())
stepwait.pop();
stepfinish.clear();
//分析可行走法,如果存在吃子走法,将当前可行吃子走法压入stepwait
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
代码练习.rar (133个子文件)
试运行.cpp 13KB
算法跳棋试运行.cpp 13KB
跳棋.cpp 8KB
week7 (1).cpp 5KB
类矩形输出.cpp 2KB
结对小组DP.cpp 2KB
w6p2.cpp 2KB
一万天之后.cpp 2KB
p图高手.cpp 2KB
w9.cpp 2KB
w5p2.cpp 1KB
俩日期间隔.cpp 1KB
IQ测试.cpp 1KB
猫和老鼠.cpp 1KB
结对学习.cpp 1KB
矩阵类加法.cpp 1KB
罗马数字转阿拉伯数字.cpp 1KB
修改的限制.cpp 981B
排序输出.cpp 961B
迷宫,cpp.cpp 947B
天天爱消除.cpp 878B
三个数的最大公约数和最小公倍数.cpp 859B
链表初尝试.cpp 853B
是1.cpp 814B
5.cpp 809B
登录系统查询成绩.cpp 769B
成绩最低分.cpp 763B
冒泡法.cpp 759B
寻找相同字符串.cpp 731B
w6p1.cpp 712B
数组元素交换.cpp 706B
电子邮箱.cpp 704B
矩阵置零.cpp 701B
教徒.cpp 689B
找到最大方阵.cpp 684B
扫雷游戏.cpp 684B
年月日的星期.cpp 673B
w5p1.cpp 631B
评分.cpp 612B
类数字字符转整数.cpp 602B
w5p3.cpp 590B
分数表示.cpp 589B
重塑矩阵.cpp 582B
类身份证.cpp 576B
螺旋矩阵.cpp 535B
开关灯.cpp 532B
树木移植.cpp 501B
电报加密.cpp 480B
变量命名.cpp 459B
字符串排序.cpp 441B
验证回文串.cpp 427B
杨辉三角.cpp 426B
矩阵的行列式.cpp 412B
特定子串的个数.cpp 412B
矩阵转置.cpp 409B
生日管家.cpp 402B
lianxi3.cpp 398B
未命名1.cpp 384B
4.cpp 372B
最大相同头字母.cpp 359B
非酋鉴定.cpp 354B
矩阵的简单行运算.cpp 338B
2.cpp 293B
3.cpp 283B
字符串组合.cpp 265B
搜索字符串中子串的位置.cpp 247B
1.cpp 208B
输出数的逆序.cpp 207B
试运行.exe 1.94MB
排序输出.exe 1.93MB
矩阵置零.exe 1.91MB
俩日期间隔.exe 1.91MB
最大相同头字母.exe 1.91MB
w6p2.exe 1.89MB
w5p3.exe 1.88MB
w6p1.exe 1.87MB
类矩形输出.exe 1.86MB
w5p1.exe 1.86MB
w5p2.exe 1.85MB
w9.exe 1.84MB
特定子串的个数.exe 1.84MB
生日管家.exe 1.83MB
成绩最低分.exe 1.83MB
登录系统查询成绩.exe 1.83MB
验证回文串.exe 1.83MB
矩阵类加法.exe 1.83MB
字符串排序.exe 1.83MB
重塑矩阵.exe 1.83MB
电报加密.exe 1.83MB
搜索字符串中子串的位置.exe 1.83MB
数组元素交换.exe 1.83MB
类身份证.exe 1.83MB
矩阵的行列式.exe 1.83MB
矩阵转置.exe 1.83MB
评分.exe 1.83MB
教徒.exe 1.83MB
类数字字符转整数.exe 1.83MB
矩阵的简单行运算.exe 1.83MB
分数表示.exe 1.83MB
未命名1.exe 1.83MB
共 133 条
- 1
- 2
weixin_64193024
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0