重新整理数据结构与算法(c#)——算法套马踏棋算法[三十三]
前言
马踏棋盘 概念在这,不做过多复述。
https://baike.sogou.com/v58959803.htm?fromTitle=马踏棋盘

思路是这样子的,一匹马有上面几种做法,然后进行尝试,然后回溯即可。
我的测试结果是没有用贪心用了 10分钟,用贪心 20秒不到。
正文
class Program
{
//棋盘列数
public static int X;
//棋盘行数
public static int Y;
//标志棋盘的各个位置是否被访问
private static bool[] visited;
//是否访问成功
private static bool finished;
public static Point Override { get; private set; }
static void Main(string[] args)
{
X = 8;
Y = 8;
int row = 1; //马儿初始位置的行,从1开始编号
int column = 1; //马儿初始位置的列,从1开始编号
//创建棋盘
int[,] chessboard = new int[X, Y];
visited = new bool[X * Y];//初始值都是false
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
traversalChessboard(chessboard, row - 1, column - 1, 1);
stopwatch.Stop();
for (int i = 0; i < X - 1; i++)
{
for (int j = 0; j < Y - 1; j++)
{
Console.Write(chessboard[i, j] + " ");
}
Console.WriteLine();
}
Console.Read();
}
public static void traversalChessboard(int[,] chessboard, int row, int column, int step)
{
//Thread.Sleep(500);
//第几步
chessboard[row, column] = step;
Console.WriteLine("走x轴"+row+"y轴:"+column);
//表示这个点被访问了
visited[row * X + column] = true;
List<Point> ps = next(new Point(column, row));
sort(ps);
while (ps.Count != 0)
{
Point p = ps[0];
ps.Remove(p);
if (!visited[p.Y * X + p.X])
{
traversalChessboard(chessboard, p.Y, p.X, step + 1);
}
}
if (step < X * Y && !finished)
{
Console.WriteLine("重置x轴" + row + "y轴:" + column);
//如果没有完成回溯重置
chessboard[row,column] = 0;
visited[row * X + column] = false;
}
else
{
finished = true;
}
}
public class Point {
public Point(int x,int y)
{
this.X = x;
this.Y = y;
}
public Point()
{
}
public int X
{
set;
get;
}
public int Y
{
set;
get;
}
}
public static List<Point> next(Point curPoint)
{
List<Point> points = new List<Point>();
Point point6 = new Point();
//显示5位置
if ((point6.X = curPoint.X - 2) >= 0 && (point6.Y = curPoint.Y - 1) >= 0)
{
points.Add(point6);
}
Point point7 = new Point();
//显示6位置
if ((point7.X = curPoint.X - 1) >= 0 && (point7.Y = curPoint.Y - 2) >= 0)
{
points.Add(point7);
}
Point point8 = new Point();
//显示7位置
if ((point8.X = curPoint.X + 1) < X && (point8.Y = curPoint.Y - 2) >= 0)
{
points.Add(point8);
}
Point point1 = new Point();
//显示0位置
if ((point1.X = curPoint.X + 2) <X && (point1.Y = curPoint.Y - 1) >= 0)
{
points.Add(point1);
}
Point point2 = new Point();
//显示1位置
if ((point2.X = curPoint.X + 2) <X && (point2.Y = curPoint.Y + 1) < Y)
{
points.Add(point2);
}
Point point3 = new Point();
//显示2位置
if ((point3.X = curPoint.X + 1) <X && (point3.Y = curPoint.Y + 2) <Y)
{
points.Add(point3);
}
Point point4 = new Point();
//显示3位置
if ((point4.X = curPoint.X - 1) >= 0 && (point4.Y = curPoint.Y + 2) < Y)
{
points.Add(point4);
}
Point point5 = new Point();
//显示4位置
if ((point5.X = curPoint.X - 2) >= 0 && (point5.Y = curPoint.Y + 1) < Y)
{
points.Add(point5);
}
return points;
}
//根据当前这个一步的所有的下一步的选择位置,进行非递减排序, 减少回溯的次数
public static void sort(List<Point> ps)
{
ps.Sort(new companer());
}
public class companer : IComparer<Point>
{
public int Compare(Point x, Point y)
{
int count1 = next(x).Count;
//获取到o2的下一步的所有位置个数
int count2 = next(y).Count;
if (count1 < count2)
{
return -1;
}
else if (count1 == count2)
{
return 0;
}
else
{
return 1;
}
}
}
}
重新整理数据结构与算法(c#)——算法套马踏棋算法[三十三]的更多相关文章
- 马踏棋盘算法递归+回溯法实现 C语言
r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- C语言二级选择题考点汇总-数据结构与算法-【考点一】 什么是算法
1.算法及其基本特征 算法是指对方案的准确描述,是解决问题的执行步骤. 算法不等于数学上的计算方法,也不等于程序.程序是算法的载体. 算法的基本特征如下: (1)可行性:步骤可实现,执行结果可达到 ...
- 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度
所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...
- 【算法总结】强化学习部分基础算法总结(Q-learning DQN PG AC DDPG TD3)
总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图.贴了代码. 1. value-based 基于价值的算法 基于价值算法是通过对agent所属的environment的状态或者状态动作对进 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 人工智能: 自动寻路算法实现(四、D、D*算法)
博客转载自:https://blog.csdn.net/kongbu0622/article/details/1871520 据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探 ...
随机推荐
- 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm
最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm ...
- kubernetes 1.20版本 二进制部署
kubernetes 1.20版本 二进制部署 目录 kubernetes 1.20版本 二进制部署 1. 前言 2. 环境准备 2.1 机器规划 2.2 软件版本 3. 搭建集群 3.1 机器基本配 ...
- Lucene轻量级搜索引擎,真的太强了!!!Solr 和 ES 都是基于它
一.基础知识 1.Lucene 是什么 Lucene 是一个本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装 Lucene 适合那种轻量级的全文搜索,我就是服 ...
- STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000
一.问题 今天在将之前的STM32 LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000.说明LwIP移植应该是没 ...
- Rust 标准库 Trait 指南
部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...
- 使用RTX Voice,用N卡打造降噪麦克风
原文地址:使用RTX Voice,用N卡打造降噪麦克风 | Stars-One的杂货小窝 随着直播的流行,不少人为了追求良好的直播效果,都选择购买相应的设备.如想要实现降噪的功能,得通过物理手段(买个 ...
- electron程序运行在某些 windows 上白屏
现象: 打包后的 electron 程序 运行在某些 windows 上白屏 项目情况: vue3.0 项目使用 vue-cli 创建 使用 vue add electron-builder 添加打 ...
- SQL注入的原理与分析
SQL注入的原理与分析 1.SQL注入的本质 2.部分SQL语句 3.SQL注入流程 一.SQL注入的本质 SQL注入的本质,就是把用户输入的数据当作代码执行 Web应用程序对用户输入的数据校验处理不 ...
- 网页上发起qq聊天
找到以前记录的小笔记,同步过来吧 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"& ...
- python基础笔记((1)
逻辑与或非用的是and or not. 除法即使整除结果也是浮点数 地板除//结果一定是整数. 内存中的字符串是Unicode编码,str.encode('utf-8 or ascii')将class ...