当前位置: 首页 > news >正文

Alogrithm:骑士走棋盘

1. 说明

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

2. 解法

骑士旅游(Knight's Tour)问题是一个经典的图算法问题,目标是在一个 N×N 的棋盘上,让西洋棋的骑士从任意一个位置出发,访问每个棋盘格子一次且仅一次。此问题可以通过递归回溯法解决,也可以优化为 Warnsdorff’s Rule 的贪心算法。

2.1 骑士的移动规则

骑士的移动方式为 “L” 形:
  • 横向移动两格,然后纵向移动一格。
  • 或者纵向移动两格,然后横向移动一格。
每个位置最多有 8 种可能的移动方向,具体视棋盘边界而定。

2.2 骑士旅游的解法

2.2.1 递归回溯法

递归回溯法尝试从起始位置依次探索每个可能的移动方向,如果某条路径可以完成骑士旅游,则返回解;否则回溯,尝试其他路径。

2.2.2 C 语言实现

#include <stdio.h>
#include <stdbool.h>#define N 8// 棋盘的 8 个可能移动方向
int rowMove[8] = {2, 1, -1, -2, -2, -1, 1, 2};
int colMove[8] = {1, 2, 2, 1, -1, -2, -2, -1};// 打印棋盘
void printSolution(int board[N][N]) {for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {printf("%2d ", board[i][j]);}printf("\n");}
}// 检查骑士是否可以移动到 (x, y)
bool isSafe(int x, int y, int board[N][N]) {return (x >= 0 && x < N && y >= 0 && y < N && board[x][y] == -1);
}// 递归回溯求解骑士旅游问题
bool solveKnightTourUtil(int x, int y, int moveCount, int board[N][N]) {if (moveCount == N * N) {return true; // 所有格子都已访问}for (int i = 0; i < 8; i++) {int nextX = x + rowMove[i];int nextY = y + colMove[i];if (isSafe(nextX, nextY, board)) {board[nextX][nextY] = moveCount; // 标记为已访问if (solveKnightTourUtil(nextX, nextY, moveCount + 1, board)) {return true; // 如果找到解,直接返回}board[nextX][nextY] = -1; // 回溯}}return false; // 无法找到解
}// 骑士旅游问题的主函数
bool solveKnightTour() {int board[N][N];// 初始化棋盘为 -1(未访问)for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {board[i][j] = -1;}}// 骑士从棋盘的左上角 (0, 0) 出发board[0][0] = 0;// 如果找到解,打印棋盘;否则返回无解if (solveKnightTourUtil(0, 0, 1, board)) {printSolution(board);return true;} else {printf("No solution exists\n");return false;}
}int main() {solveKnightTour();return 0;
}

2.2.3 代码解释

  • 移动方向数组:
    • rowMove 和 colMove 数组定义了骑士的 8 种移动方式。
  • isSafe 函数
    • 判断骑士是否可以移动到新的位置 (x, y),确保其在棋盘范围内且未访问过。
  • 递归函数 solveKnightTourUtil
    • 从当前棋盘位置 (x, y) 出发,尝试所有可能的 8 个方向。
    • 如果移动后所有棋盘格都被访问,则返回解。
    • 否则回溯,撤销当前移动。
  • solveKnightTour 函数
    • 初始化棋盘,将骑士放置在起始位置 (0, 0)。
    • 调用递归回溯函数寻找解。
  • 打印棋盘:
    • 解的结果以棋盘的形式打印,其中数字表示骑士访问每个格子的顺序。

2.2.4 样例输出

对于 8×8 的棋盘,可能的输出如下(路径可能因算法不同而不同):

 0 59 38 33 30 17  8 63 
37 34 31 60  9 62 29 16 
58  1 36 39 32 27 18  7 
35 48 41 26 61 10 15 28 
42 57  2 49 40 23  6 19 
47 50 45 54 25 20 11 14 
56 43 52  3 22 13 24  5 
51 46 55 44 53  4 21 12

 

2.2.5 关键点

  • 回溯:
    • 尝试所有可能的路径,如果失败则撤销上一步的操作。
  • 时间复杂度:
    • 理论上,递归回溯法的时间复杂度为 O(8^n),其中 n 是棋盘的格子数(最坏情况下)。
    • 实际运行时间受剪枝和优化策略影响。
  • Warnsdorff’s Rule(优化方法):
    • 骑士优先选择移动选项最少的路径,从而降低回溯的频率,极大地优化求解效率。

相关文章:

Alogrithm:骑士走棋盘

1. 说明 骑士旅游&#xff08;Knights tour&#xff09;在十八世纪初倍受数学家与拼图迷的注意&#xff0c;它什么时候被提出已不可考&#xff0c;骑士的走法为西洋棋的走法&#xff0c;骑士可以由任一个位置出发&#xff0c;它要如何走完所有的位置&#xff1f; 2. 解法 骑士旅…...

Oracle 与 达梦 数据库 对比

当尝试安装了达梦数据库后&#xff0c;发现达梦真的和Oracle数据库太像了&#xff0c;甚至很多语法都相同。 比如&#xff1a;Oracle登录数据库采用sqlplus&#xff0c;达梦采用disql。 比如查看数据视图&#xff1a;达梦和Oracle都有 v$instance、v$database、dba_users等&a…...

[COLM 2024] V-STaR: Training Verifiers for Self-Taught Reasoners

本文是对 STaR 的改进方法&#xff0c;COLM 是 Conference On Language Models&#xff0c;大模型领域新出的会议&#xff0c;在国际上很知名&#xff0c;不过目前还没有被列入 ccf list&#xff08;新会议一般不会列入&#xff09;&#xff1b;作者来自高校、微软研究院和 Goo…...

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…...

蓝桥杯刷题——day4

蓝桥杯刷题——day4 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 小蓝和朋友们在玩一个报数游戏。由于今年是2024 年&#xff0c;他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是&#xff1a;20,24,40,48,60,72,80,96,100,120。请问第2…...

内网是如何访问到互联网(H3C源NAT)

H3C设备NAPT配置 直接打开29篇的拓扑&#xff0c;之前都配置好了 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil 现在是出口路由器可以直接访问61.128.1.1&#xff0c;下面的终端访问不了&#xff0c;需要做NAPT源…...

源码分析之Openlayers中的Zoom缩放控件

概述 放大或缩小是地图中最基本的功能&#xff0c;本文主要介绍分析 Openlayers 中Zoom缩放控件的源码实现。 源码分析 Zoom控件继承Control类&#xff0c;关于Control类&#xff0c;可以参考这篇文章源码分析之Openlayers中的控件篇Control基类介绍 如果直接实例化Zoom类&…...

k8s的ConfigMap是什么, 为什么设计ConfigMap, 如何使用ConfigMap

ConfigMap简介, 为什么设计ConfigMap 在k8s中, ConfigMap是一种API对象, 用于将非机密的配置数据存储到键值对中。 Configmap作用是, 把配置数据从应用代码中分隔开, 让镜像和配置文件解耦&#xff0c;实现了镜像的可移植性。 举例&#xff1a; 我有一个Squid(正向代理)的Pod…...

fiddler设置抓取https,还抓取不到https如何解决?

一、清楚 C:\Users\Admin\AppData\Roaming\Microsoft\Crypto\RSA 目录下所有文件&#xff08;首次安装fiddler请忽略&#xff09; 二、清除电脑上的根证书&#xff0c;WINR快捷键&#xff0c;输入&#xff1a;certmgr.msc&#xff0c; 然后回车&#xff0c;查找所有fiddler证书…...

Python高性能web框架-FastApi教程:(1)创建一个简单的FastApi

&#xff08;1&#xff09;创建一个简单的FastApi 1. 导入必要的库 from fastapi import FastAPI import uvicornFastAPI 是一个用于构建现代、快速&#xff08;高性能&#xff09;的Web API的Python框架。uvicorn 是一个ASGI服务器&#xff0c;用于运行异步的Python Web应用…...

Django基础之模板

一.前言 前面我们讲了视图&#xff0c;我们今天来讲一下模板&#xff0c;模板其实也就是视图中render返回的html进行的渲染&#xff0c;然后展示到浏览器页面上去&#xff0c;那我们今天就来和大家来说一下模板的基本用法 二.寻找html模板 这个也就是我们前面说了的找html&a…...

RabbitMQ Work Queues (工作队列模式) 使用案例

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;RabbitMQ &#x1f4da;本系列文章为个人学…...

C#高级:Winform桌面开发中TreeView的基础例子

一、方案一&#xff1a;免递归使用树 namespace WinFormsApp1 {public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 自定义树实体/// </summary>public class WinFormTree{/// <summary>/// 标签名称/// </summ…...

大模型的文件有哪些?

在大模型仓库&#xff08;如Hugging Face&#xff09;中&#xff0c;例如&#xff1a;https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files&#xff0c;通常会发现以下几类文件&#xff1a; 模型权重文件&#xff1a;存储训练好的模型参数&#xff0c;是模型推理和微调…...

QT 国际化(翻译)

QT国际化&#xff08;Internationalization&#xff0c;简称I18N&#xff09;是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用&#xff0c;并且可以根据用户的语言和地区提供本地化的使用体验。…...

C 进阶 — 指针的使用

C 进阶 — 指针的使用 主要内容 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 6、函数指针数组 7、指向函数指针数组的指针 8、 回调函数 9、指针和数组练习题 前节回顾 1、指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一…...

【经验分享】容器云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

MFC学习笔记专栏开篇语

MFC&#xff0c;是一个英文简写&#xff0c;全称为 Microsoft Foundation Class Library&#xff0c;中文翻译为微软基础类库。它是微软开发的一套C类库&#xff0c;是面向对象的函数库。 微软开发它&#xff0c;是为了给程序员提供方便&#xff0c;减少程序员的工作量。如果没…...

电子科技大学《高级算法设计与分析》期末复习问题汇总(客观题-选择题、判断题)

电子科技大学《高级算法设计与分析》问题汇总_已知背包问题的动态规划算法时间复杂度为o(nw),其中n为物品数目,w为背包容量。请-CSDN博客 转载自上面这个链接&#xff0c;古希腊掌管成电专业课的神&#xff01;&#xff01;为了防止他的链接失效&#xff0c;自己也转存一份 &…...

GPTcelltype——scRNA-seq注释

#安装包 install.packages("openai") remotes::install_github("Winnie09/GPTCelltype") #填写API Sys.setenv(OPENAI_API_KEY your_openai_API_key) #加载包 #Load packages library(GPTCelltype) library(openai) #准备文件 #Assume you have already r…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...