如何使用C++基于栈的深搜算法实现马踏棋盘
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,这篇文章主要介绍如何使用C++基于栈的深搜算法实现马踏棋盘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!马踏棋盘(基于栈的深搜算法实现)简单来说,从任意指定方格出发,为马寻找一
千家信息网最后更新 2024年11月17日如何使用C++基于栈的深搜算法实现马踏棋盘
这篇文章主要介绍如何使用C++基于栈的深搜算法实现马踏棋盘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
马踏棋盘(基于栈的深搜算法实现)
简单来说,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径,这就是马踏棋盘的简单描述。
#include#include #define M 8 //行#define N 8 //列 typedef struct snode //坐标{ int flag; int x; int y;}stack;typedef struct node { int top; //记录走了多少步top+1 int flag; //记录上一步走的方向 stack * p; //路径栈}LNode; LNode * CreateStacke(); //创建,并初始化void Judge(LNode * s, int chess[][N]); //判断往哪走void Push(LNode * s, stack x); //入栈操作void Pop(LNode * s); //出栈操作int IsFull(LNode * s); //判满int IsEmpty(LNode * s); //判空 int main(){ int chess[M][N] = {0}; //棋盘 int i, j; //循环变量 LNode * step; //step存的是走的路径 step = CreateStacke(); Judge(step, chess); for (i = 0; i < N; i++){ for (j = 0; j < M; j++){ printf("%2d ", chess[i][j]); } printf("\n"); } return 0;}LNode * CreateStacke(){ LNode * s = (LNode *)malloc(sizeof(LNode)); if (!s){ printf("内存空间不足!\n"); system("pause"); exit(0); } s->p = (stack *)malloc(sizeof(stack) * M * N); if (!s->p){ printf("内存空间不足!\n"); system("pause"); exit(0); } s->top = -1; // 把top放在栈底 return s;}void Judge(LNode * s, int chess[][N]) { int ch[8][2] = { //马可能走的八个方向 {1, -2}, { 2, -1}, {2, 1 }, { 1, 2 }, {-1, 2}, {-2, 1 }, {-2, -1},{-1, -2} }; int i, j = 1, flag = 1; stack t; printf("请输入马的初始位置:(%d * %d)\n", M, N); scanf("%d%d", &t.y, &t.x); if (t.x <= 0 || t.x > N || t.y <= 0 || t.y > N){ printf("输入的坐标超出范围!\n"); exit(0); } t.x--; t.y--; chess[t.y][t.x] = 1; //选择马的第一个落脚点 Push(s, t); while (s->top < M * N - 1 && s->top != -1){ for (i = 0; i < 8; i++){ t.x = s->p[s->top].x + ch[i][0]; t.y = s->p[s->top].y + ch[i][1]; //如果它的坐标没有超出范围,并且没有走过,则把该路线存入路径栈 if (t.x >= 0 && t.y >= 0 && t.x < N && t.y < M && !chess[t.y][t.x]){ if(flag){ //没有退回去 Push(s, t); chess[t.y][t.x] = s->top + 1; s->p[s->top - 1].flag = i; flag = 1; break; } else{ //退回去了 if (s->p[s->top].flag < i){ //重新走时,让它的方向不等于原先的方向 flag = 1; } } } } //如果没有能走的路时,即,所有的路径都超出范围,或者,该位置已经走过了,则,退到上一步,重新选择; if (i == 8){ chess[s->p[s->top].y][s->p[s->top].x] = 0; Pop(s); flag = 0; } }}void Push(LNode * s, stack x){ if (IsFull(s)){ printf("栈上溢,不能进行入栈操作!\n"); exit (0); } else{ s->top++; s->p[s->top] = x; }}void Pop(LNode * s){ if (IsEmpty(s)){ printf("栈为空,不能进行出栈操作!\n"); exit(0); } s->top--;}int IsFull(LNode * s){ if (s->top >= M * N){ return 1; } else{ return 0; }}int IsEmpty(LNode * s){ if (s->top == -1){ return 1; } else{ return 0; }}
以上是"如何使用C++基于栈的深搜算法实现马踏棋盘"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
棋盘
t.y
路径
t.x
算法
坐标
C++
内容
方向
篇文章
范围
输入
价值
位置
兴趣
内存
变量
小伙
小伙伴
就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
阿里云北京服务器存放地点云空间
ios数据库软件开发
获取gmt时间服务器
服务器添加域名白名单
服务器能当电脑用吗
天天飞网络技术
数字化法制展馆软件开发
北京电脑软件开发招聘信息
hp打印机网络安全已禁用
安徽无线网络技术管理系统
软件开发中特性的定义
七十数据库
网络安全不信谣传谣
长沙嵌入式软件开发公司
数据库中存储的是什么意思
安全软件开发技术
表决通过了《网络安全法》
威海导航软件开发
jpa 连接数据库
山西统一软件开发有哪些
企业开展网络安全演练报告
redis 服务器
随机从数据库取出多条数据
四川银行软件开发招聘信息
安徽通用软件开发价钱
虹口区软件开发技术服务流程
国家网络安全宣传大使证书
山力通信网络技术有限公司
绿道云互联网科技有限公司
球球大作战为什么服务器没反应