文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++怎么实现骑士走棋盘算法

2023-06-19 13:26

关注

这篇“C++怎么实现骑士走棋盘算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么实现骑士走棋盘算法”文章吧。

1.问题描述

骑士旅游Knight tour在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋 棋的走法,骑士可以由任一个位置出发,它要如何走完所有的位置。

2.基本思路

骑士的走法,基本上可以用递回来解决,但是纯粹的递回在维度大时相当没有效率,一个聪明的解法由J.CWarnsdorff 在1823年提出, 简单地说,先将最难的位置走完,接下来的路就宽广了,骑士所想要的下一步,为下一不再 选 择时,所能走的步数最少的一步。使用这个方法,在不使用递回的情况下,可以有较高的机率找出走法(找不到走 的机率也是有的)

3.代码实现

#include <stdio.h> int 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++怎么实现骑士走棋盘算法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯