C++怎么实现骑士走棋盘算法
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇"C++怎么实现骑士走棋盘算法"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C+
千家信息网最后更新 2025年02月05日C++怎么实现骑士走棋盘算法
这篇"C++怎么实现骑士走棋盘算法"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++怎么实现骑士走棋盘算法"文章吧。
1.问题描述
骑士旅游Knight tour在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋 棋的走法,骑士可以由任一个位置出发,它要如何走完所有的位置。
2.基本思路
骑士的走法,基本上可以用递回来解决,但是纯粹的递回在维度大时相当没有效率,一个聪明的解法由J.CWarnsdorff 在1823年提出, 简单地说,先将最难的位置走完,接下来的路就宽广了,骑士所想要的下一步,为下一不再 选 择时,所能走的步数最少的一步。使用这个方法,在不使用递回的情况下,可以有较高的机率找出走法(找不到走 的机率也是有的)
3.代码实现
#includeint pos[8][8] = { 0 }; int travel(int, int); int travel(int x, int y) { int i, j, k, l, m; int tmpX, tmpY; int count, min, tmp; //骑士可走的八个方向(顺时针) int ktmoveX[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }; int ktmoveY[8] = { -2, -1, 1, 2, 2, 1, -1, -2 }; //测试下一步坐标 int nextX[8] = { 0 }; int nextY[8] = { 0 }; //记录每个方向的出路的个数 int exists[8] = { 0 }; //起始用1标记位置 i = x; j = y; pos[i][j] = 1; //遍历棋盘 for (m = 2; m <= 64; m++) { //初始化八个方向出口个数 for (l = 0; l < 8; l++) { exists[l] = 0; } l = 0; //计算可走方向 //试探八个方向 for (k = 0; k < 8; k++) { tmpX = i + ktmoveX[k]; tmpY = j + ktmoveY[k]; //边界 跳过 if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) { continue; } //可走 记录 if (pos[tmpX][tmpY] == 0) { nextX[l] = tmpX; nextY[l] = tmpY; l++; //可走方向加1 } } count = l; //无路可走 返回 if (count == 0) { return 0; //一个方向可走 标记 } else if (count == 1) { min = 0; //找出下个位置出路个数 } else { for (l = 0; l < count; l++) { for (k = 0; k < 8; k++) { tmpX = nextX[l] + ktmoveX[k]; tmpY = nextY[l] + ktmoveY[k]; if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) { continue; } if (pos[tmpX][tmpY] == 0) { exists[l]++; } } } //找出下个位置出路最少的方向 min = 0; tmp = exists[0]; for (l = 0; l < count; l++) { if (exists[l] < tmp) { tmp = exists[l]; min = l; } } } //用序号标记走过的位置 i = nextX[min]; j = nextY[min]; pos[i][j] = m; } return 1;} int main(){ int i, j, startX, startY; while (1) { printf("输入起始点:"); scanf("%d%d", &startX, &startY); if (travel(startX, startY)) { printf("游历完成!"); } else { printf("游历失败!"); } for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { printf("%2d ", pos[i][j]); } printf(""); } printf(""); } return 0;}
以上就是关于"C++怎么实现骑士走棋盘算法"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
骑士
方向
位置
内容
棋盘
走法
算法
C++
个数
出路
标记
个位
文章
机率
知识
篇文章
起始
宽广
聪明
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
小马过河互联网科技
网络安全漫画名称
软件开发方法目标
华为2017软件开发大赛
监控系统存储服务器有什么用
中国网络安全每年投入
网络安全责任制度
合肥交通软件开发外包公司
虚拟机连接到另一个服务器
高级软件开发工程师模拟试题
原神小米端是什么服务器
浙江杭州正泰网络技术有限公司
网络安全法第三十二条规则
手机网络安全证书已经过期
江门网络安全周
合肥网庭网络技术有限公司
指定数据库全名oracle
怎么把多台电脑连接一个服务器
软件开发项目程序
绝地求生端游进游戏服务器崩溃
mysql 启动服务器
虚拟机连接到另一个服务器
软件开发系统分析
游戏主机用什么服务器
软件开发股
华为云白云区软件开发基地
蚂蚁网络技术部
联网成功服务器连接失败
漯河网络安全审查
查看服务器磁盘是否有故障