重新整理数据结构与算法(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 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探 ...
随机推荐
- PostgreSql一个月学习计划
1.背景 国内使用数据库最多的莫过于mysql,大部分程序员第一次接触数据库就是mysql.(毕竟免费的 = =!)但近年来,有一些黑马出现(如下图),其中表现最突出的莫过于PostgreSQL.特规 ...
- Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程)
Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程) 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习 ...
- 小程序登录V2
参考:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801(通知) https:/ ...
- Java线上诊断神器Arthas:常用命令详解!
有关Arthas基本介绍.安装部署.arthas idea插件在上篇文章已经介绍过,这里就不在重述. 文章地址:Java诊断工具Arthas:开篇之watch实战 上篇重点讲了 watch 命令.这篇 ...
- AQS很难,面试不会?看我一篇文章吊打面试官
AQS很难,面试不会?看我一篇文章吊打面试官 大家好,我是小高先生.在这篇文章中,我将和大家深入探索Java并发包(JUC)中最为核心的概念之一 -- AbstractQueuedSynchroniz ...
- npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\shuzi\Desktop\保密文件项目\test-ui/package.json npm ERR! errno -4058
打开一个新的项目,因为当前项目文件夹下没有npm,"dev": "npm run start:dev",所以所以没有展示对应的运行图,如下图: 打开一个新的前端 ...
- 七月练习:杀完NOIP全集
注:标记☆的是我未理解透彻的,标记★的是已经理解完的重点. 7.31:所有题目已经上传! 7.1 CF581A Vasya the Hipster 水.随便找规律.(CF 乱入) P1199 [NOI ...
- 【Java】使用位运算完成数组中两个变量交换位置
1 /** 2 * 3 */ 4 package com.raliable.chapter_0; 5 /** 6 * @author : Administrator 7 * @date :2022年4 ...
- 7 HTML锚点应用
7 锚点应用 锚点( anchor )是超链接的一种应用,也叫命名锚记,锚点可以像一个定位器一样,可以实现页面内的链接跳转,运用相当普遍.例如,我们有一个网页,由于内容太多,导致页面很长,而且里面的内 ...
- #容斥,排列组合#U138404 选数字
题目 给定长度为\(n,n\leq 10^5\)的序列\(a,a_i,m\leq 255\),多组询问求 \[\sum_{i=l}^{r-2}\sum_{j=i+1}^{r-1}\sum_{k=j+1 ...