前言

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

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. Java //手动输入3个数,并从小到大排序

    1 //手动输入3个数,并从小到大排序 2 //import java.util.Sanner; 3 4 System.out.println("请输入第一个数:"); 5 Sca ...

  2. 【风控算法】二、SQL->Python->PySpark计算KS,AUC及PSI

    KS,AUC 和 PSI 是风控算法中最常计算的几个指标,本文记录了多种工具计算这些指标的方法. 生成本文的测试数据: import pandas as pd import numpy as np i ...

  3. iview viewDesign table 单选 Radio

    columns.js export default [ { title: '选择', slot: 'choose', align: 'center', width: 100 }, table里面 &l ...

  4. C++中fopen的句柄返回NULL

    我们在使用fopen打开文件的时候有时会出现失败返回null情况,但是我们不能直接通过log具体是什么原因导致的,所以这时我们可以通过errno和strerror获取错误码和错误信息. 我遇到的是错误 ...

  5. 《TencentNCNN系列》 之工作原理简要解析(以LeNet-5为例)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. autowired循环调用

    下面这段代码,表示那你的bean进行了循环调用. org.springframework.beans.factory.BeanCreationException: Error creating bea ...

  7. 调试3D渲染和3D可视化的五个好处

    建筑和建筑环境是我们日常生活中不可避免的一部分,直接影响我们和我们的福祉.它可以是我们的家.办公室.附近的教堂或城市的商业综合体;所有这一切的设计和规划都是建筑.然而,具有讽刺意味的是,建筑的交流往往 ...

  8. 直播预告:面对技术带来的新机遇,CG人如何腾飞?

    "新锐先锋,玩转未来"--首届实时染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视典 ...

  9. abp9 .net8 升级错误记录

    错误一. Cannot find compilation library location for package 'System.Security.Cryptography.Pkcs' 修复方法:  ...

  10. r-nacos v0.4.0版本发布

    r-nacos是一个用 rust重新实现的nacos. r-nacos比java实现的nacos更轻量.快速.稳定:合适在开发.测试.受资限服务等环境平替nacos服务使用. r-nacos v0.4 ...