【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)

简介: 【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)

hello大家好! 我依然是你们熟悉的槿凉。那么最近呢由于躺平了几天,也没有来得及更新博客,没有办法啦!学校封的严严实实,闷在学校里真的是十分难受。好叭,难受归难受,也期待着早点期末考试,早点回家,早点出狱(哈哈哈哈哈哈)! 好了,废话不多说,那么该卷还是得卷,今天呢我们就来说说这个马踏棋盘问题

9d06e82273504d068c4869870cf86718.jpg

定义:这里也不能说是定义叭,哈哈,其实这个算法就是一个游戏,即象棋里面的马走“日”,按照这个规则来限定我们设计的棋盘,这里我们规定我们设计的棋盘里马不能走已经走过的格子,同时要求马要走完所有的格子。来我们看一下我们要设计的棋盘:

4977b75209d647b39095ee9454dfd1d5.jpg

这里我们设计一个8*8的棋盘,马儿所在的位置是第五行 第五列,马儿现在有0 1 2 3 4 5 6 7 个位置可以选择走,那么我们怎么设计这个算法来解决让马儿一次性走完所有的格子呢?

来看一段代码,我们先设计棋盘,棋盘是一个二维数组:

privatestaticintx;//棋盘的列数privatestaticinty;//棋盘的行数x=8;
y=8;

然后我们来判断马儿可以走哪些位置,走的位置是有条件的,不能越界:

publicstaticArrayList<Point>next(PointcurPoint){
ArrayList<Point>ps=newArrayList<Point>();
Pointp1=newPoint();
//表示马儿可以走5这个位置if((p1.x=curPoint.x-2)>=0&& (p1.y=curPoint.y-1)>=0) {
ps.add(newPoint(p1));
         }
//表示马儿可以走6这个位置if((p1.x=curPoint.x-1)>=0&& (p1.y=curPoint.y-2)>=0) {
ps.add(newPoint(p1));
         } 
//表示马儿可以走7这个位置if((p1.x=curPoint.x+1)<x&& (p1.y=curPoint.y-2)>=0) {
ps.add(newPoint(p1));
         }
//表示马儿可以走0这个位置if((p1.x=curPoint.x+2)<x&& (p1.y=curPoint.y-1)>=0) {
ps.add(newPoint(p1));
         } 
//表示马儿可以走1这个位置if((p1.x=curPoint.x+2)<x&& (p1.y=curPoint.y+1)<y) {
ps.add(newPoint(p1));
         } 
//表示马儿可以走2这个位置if((p1.x=curPoint.x+1)<x&& (p1.y=curPoint.y+2)<y) {
ps.add(newPoint(p1));
         } 
//表示马儿可以走3这个位置if((p1.x=curPoint.x-1)>=0&& (p1.y=curPoint.y+2)<y) {
ps.add(newPoint(p1));
         }
//表示马儿可以走4这个位置if((p1.x=curPoint.x-2)>=0&& (p1.y=curPoint.y+1)<y) {
ps.add(newPoint(p1));
         }
returnps;
     }

   我们定义一个ArrayList<point>,用来存放我们走过的格子的集合,通过if语句来判断条件,注意这里的x我们表示的是棋盘的列数,y表示的棋盘的行数,p1.curPoint.x-1表示棋盘的列数减一,减一之后不能小于零,否则会越界,同理,对于y(行数),也要保证不能越界,越界就会导致栈溢出。

       接下来我们判断马儿是否完成了任务,使用step和应该走的步数相比较

       如果没有达到数量,则表示没有完成任务,将整个棋盘置0   来看具体的代码实现:

if(step<x*y&&!finished){
chessboard[row][column] =0;
visited[row*x+column]=false;
         }else {
finished=true;
         }

好了,那么到这里我们来定义一个函数,用来说明马儿的起始位置,以及下一个可以访问的位置,同时对集合进行遍历,最后看看能不能得到我们想要的结果:

publicstaticvoidtravelChessboard(int[][] chessboard,introw,intcolumn,intstep) {
chessboard[row][column] =step;
//row=4X=8,column= 4=4*8+4=36visited[row*x+column] =true;//标记改为自已经被访问//获取下一个可以访问的位置ArrayList<Point>ps=next(newPoint(column,row));
//对ps进行排序,排序的规则就是对ps的所有Point对象的下一步的位置的数目,进行非递减排序sort(ps);
//遍历pswhile(!ps.isEmpty()) {
Pointp=ps.remove(0);//取出下一个可以走的位置if(!visited[p.y*x+p.x]){//说明还没有被访问过travelChessboard(chessboard,p.y,p.x,step+1);
            }
        }

是不是听得有点懵呢?没有关系,多看几遍代码里面的注释就OK啦!(这里我个人感觉马踏棋盘问题还是有点难的 大家不理解的可以多看几遍哈!)

可以发现我们虽然运行了,但是耗时是非常的长,我这里也是等了估计40秒左右才看到运行结果,那么如何对这个算法进行优化呢?

这里我们使用贪心算法来优化这个问题:(贪心算法这里不做详细描述,在后面的博客里会陆续给出,可以看懂代码就可以啦)

//根据当前这一步的所有下一步的选择位置,进行非递减排序 减少回溯publicstaticvoidsort(ArrayList<Point>ps) {
ps.sort(newComparator<Point>() {
publicintcompare(Pointo1,Pointo2) {
intcount1=next(o1).size();//获取o1的下一步所有位置的个数intcount2=next(o2).size();//获取o2的下一步所有位置的个数if(count1<count2) {
return-1;
            }
elseif(count1==count2) {
return0;
                }
else {  
return1;
            }
    }
});
     }
   }
相关文章
|
8天前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
38 15
|
14天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
24天前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
46 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
7天前
|
存储 Java 数据安全/隐私保护
Java语言位运算符详解
Java语言提供了7种位运算符:按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(&lt;&lt;)、带符号右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;)。这些运算符主要用于对long、int、short、byte和char类型的数据进行二进制位级别的操作,不能用于double、float和boolean类型。文中详细讲解了每种运算符的规则和应用场景,并指出位运算在实际开发中有重要应用价值,不仅限于面试。
|
1月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
116 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
16天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
29 3
|
23天前
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
23 1
|
1月前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
1月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
140 5
|
10天前
|
Java 开发者
课时2:Java语言特点
课时2介绍了Java语言的多个关键特性。作为开源且半开源的产品,Java成为通用技术标准,拥有透明的开发环境。其面向对象的设计、自动内存回收、简化指针处理(使用引用)、支持多线程编程、高效的网络处理能力(如NIO)及良好的可移植性,共同促成了Java的强大生态系统和广泛应用。

热门文章

最新文章