前言

马踏棋盘 概念在这,不做过多复述。

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#)——算法套马踏棋算法[三十三]的更多相关文章

  1. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  2. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  3. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  4. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  5. C语言二级选择题考点汇总-数据结构与算法-【考点一】 什么是算法

      1.算法及其基本特征 算法是指对方案的准确描述,是解决问题的执行步骤. 算法不等于数学上的计算方法,也不等于程序.程序是算法的载体. 算法的基本特征如下: (1)可行性:步骤可实现,执行结果可达到 ...

  6. 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度

    所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...

  7. 【算法总结】强化学习部分基础算法总结(Q-learning DQN PG AC DDPG TD3)

    总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图.贴了代码. 1. value-based 基于价值的算法 基于价值算法是通过对agent所属的environment的状态或者状态动作对进 ...

  8. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  9. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  10. 人工智能: 自动寻路算法实现(四、D、D*算法)

    博客转载自:https://blog.csdn.net/kongbu0622/article/details/1871520 据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探 ...

随机推荐

  1. 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm

    最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm ...

  2. kubernetes 1.20版本 二进制部署

    kubernetes 1.20版本 二进制部署 目录 kubernetes 1.20版本 二进制部署 1. 前言 2. 环境准备 2.1 机器规划 2.2 软件版本 3. 搭建集群 3.1 机器基本配 ...

  3. Lucene轻量级搜索引擎,真的太强了!!!Solr 和 ES 都是基于它

    一.基础知识 1.Lucene 是什么 Lucene 是一个本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装 Lucene 适合那种轻量级的全文搜索,我就是服 ...

  4. STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000

    一.问题 今天在将之前的STM32 LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000.说明LwIP移植应该是没 ...

  5. Rust 标准库 Trait 指南

    部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...

  6. 使用RTX Voice,用N卡打造降噪麦克风

    原文地址:使用RTX Voice,用N卡打造降噪麦克风 | Stars-One的杂货小窝 随着直播的流行,不少人为了追求良好的直播效果,都选择购买相应的设备.如想要实现降噪的功能,得通过物理手段(买个 ...

  7. electron程序运行在某些 windows 上白屏

    现象: 打包后的 electron 程序 运行在某些 windows 上白屏 项目情况: vue3.0  项目使用 vue-cli 创建 使用 vue add electron-builder 添加打 ...

  8. SQL注入的原理与分析

    SQL注入的原理与分析 1.SQL注入的本质 2.部分SQL语句 3.SQL注入流程 一.SQL注入的本质 SQL注入的本质,就是把用户输入的数据当作代码执行 Web应用程序对用户输入的数据校验处理不 ...

  9. 网页上发起qq聊天

    找到以前记录的小笔记,同步过来吧 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"& ...

  10. python基础笔记((1)

    逻辑与或非用的是and or not. 除法即使整除结果也是浮点数 地板除//结果一定是整数. 内存中的字符串是Unicode编码,str.encode('utf-8 or ascii')将class ...