摘要:骑士游历问题是经典的NP问题。在骑士游历问题常规算法的基础上,提出一个新的算法――预见算法,用Java实现该算法,提高程序的运行效率。   关键词:骑士游历;预见;Java算法

1 骑士游历问题

在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次。若给定起始位置(x0,y0),编程探索出一条路径,沿着这条路径马能遍历棋盘上的所有单元格。

设当前马在棋盘的某个位置(x,y)上,按照规则,下一步有8个方向可走。

设二维数组mat表示棋盘,每个元素表示棋盘的一格,其值定义如下:

0表示马未到达过

Mat[i,j]= -1表示棋盘边界

自然数 表示马到达该格的步数

2 常规的回溯算法

2.1 设计思想

马从棋盘上的某一初始位置(x0,y0)开始,每次选择一个方向k,向前走一格,直到走完64格为止。每走一格,设置数组中相应格的元素值为马走的步数。

如果选择的方向k=0,表示可能的8种走向都试探不通,不通的原因是走向超出了棋盘范围,或当前位置已经被马访问过。此时马已无路可走,说明前几步走得不对,应该退回去重新换一种走法,这种逐步试探的设计思想称为回溯算法。

2.2 性能评价

回溯算法在每一格上朝一个方向盲目地进行试探,遇到在某一格上所有方向都不能走通时,才回到前一格上来试探另一个方向。当每一格上的所有方向都试探过,不能走通时,才做出“走不通”的结论。因此该算法在探索时带有一定的盲目性和随机性,运行效率较低。

3 预见算法

3.1 设计思想

回溯算法的思路是可行的,但它的运行效率较低,原因在于每步试探的随机性和盲目性。如果能够找到一种克服这种随机性和盲目性的办法,按照一定规律选择前进的方向,则将增加成功的可能性,运行时间也大为缩短。本文提出的算法在这方面有所突破。

如果在每步选择方向时,不是任意选择一个方向,而是经过一定的测试和计算,“预见”每条路的“宽窄”,再选择一条最“窄”的路先走,成功的可能性较大。理由是先走“困难的路”,光明大道留在后面。因为每一格迟早都要走到,与其把困难留在后面,不如先走“困难的路”,这样路就会越走越宽,成功的机会就越大。这种方法称为预见算法。

3.2 实现手段

为每个方向测定一个值――可通路数,它表示该位置上还有多少条通路。在每一格上对8个方向都进行试探,并分析比较,下一步应该选择可通路数值最小的方向走。

4 用Java实现算法

本例声明Horse类,成员变量mat以二维数组表示棋盘,show表示是否显示中间结果,内部类Position中的成员变量x和y表示棋盘上一格的位置,x和y从1开始计数。

public class Horse

{private int mat[][]; //二维数组表示棋盘

boolean show; //是否显示中间结果

class Position//内部类

{int x,y;//表示棋盘上一格的位置

Position (int x,int y)

{this.x=x;

this.y=y;}

Position ()

{this(1,1);}

Position (Position p)

{this.x=p.x;

this.y=p.y;}

}

public Horse(int n,int x,int y,boolean show)//数组比实际棋盘多两行两列

{mat=new int[n+2*2][n+2*2]:

this.show=show;

inition(); //棋盘初始化

play(x,y);}

public Horse(int n,int x,int y)

{this(n,x,y,false);}

public Horse(int n)

{this(n,1,1);}

public Horse()

{this(8,1,1);}

public void inition()//棋盘初始化

{int i,j;

for(i=0;i=1&&p.x=1&&p.y   else

return false;}

public Position goaStep(Position p,int k) //返回p位置按k方向的下一位置

{int x=p.x;

int y=p.y;

switch(k)

{case 1:x-=2;y++;break;

case 2:x--;y+=2;break;

case 3:x++;y+=2;break;

case 4:x+=2;y++;break;

case 5:x+=2;y--;break;

case 6:x++;y-=2;break;

case 7:x--;y-=2;break;

case 8:x-=2;y--;break;}

return new Position(x,y);

}

public int select(Position p)//选择p位置到达下一位置next1应走的方向k

//试探next1的8个方向位置next2的可通路数road,road的最小值为minroad

{int i=0,j=0,k=0,road=0,minroad=8;

Position next1=null,next2=null;

if(this.show)

{System.out.println(“当前位置:(”+p.x+”,”+p.y+”)”);

this.output();

System.out.println(”方向下一位置可通方向可通路数”);}

for(i=1;i

java编写类骑士游历_[基于Java的骑士游历问题的预见算法]骑士游历问题相关推荐

  1. 用java编写一个聊天程序_基于JAVA实现的一个简单的网络聊天程序

    一.Java Socket的概述 1.Socket套接字方便了开发网络应用程序.TCP面向连接的可靠传输协议.具有数据确认和数据重传机制.保证了发送数据一定能到达通信的对方.UPD协议无连接,不可靠的 ...

  2. java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文

    基于JAVA开发的电信IP计费系统设计毕业论文 本科毕业设计(论文)基于 JAVA 开发的电信 IP 计费系统毕业设计(论文)任务书学院:信息科学与工程学院 系级教学单位:电子与通信工程学号学生姓名专 ...

  3. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...

    <基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc>由会员分享,可免费在线阅读全文,更多与<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述& ...

  4. java怎么写桌面日历_基于java的桌面日历系统的设计与实现毕业设计论文最终版.doc...

    基于java的桌面日历系统的设计与实现毕业设计论文最终版 分类号_______________ 密级________________ UDC _______________ 学号_ ___ 毕业设计( ...

  5. java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...

    java编写排序的代码 在Java 8之前,您编写了几行代码来对对象集合进行排序? Java 8您需要多少个? 您可以在Java 8中用一行完成. 让我们看看下面的Employee类. public ...

  6. java技术论坛的毕业设计_基于java的bbs论坛设计,软件毕业设计

    基于java的bbs论坛设计,软件毕业设计 XXX毕 业 设 计 任 务 书专业 软件技术 年级 xx 级 班级 二班姓名 xx 学号 20 xx0205xx3威 海 职 业 学 院 教 务 处 编 ...

  7. java中国象棋网络对弈_基于JAVA的中国象棋对弈系统(附答辩记录)

    基于JAVA的中国象棋对弈系统(附答辩记录)(包含选题审批表,任务书,开题报告,中期报告,毕业论文7100字,程序) 摘  要:本毕业设计采用Java实现中国象棋对弈,可以由两个玩家操作来进行.其图形 ...

  8. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

    植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...

  9. java web聊天室论文_基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc...

    基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc 还剩 52页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...

  10. java程序实现剪刀石头布功能_基于JAVA的剪刀石头布游戏设计——Java课程设计报告_...

    基于JAVA的剪刀石头布游戏设计 1剪刀石头布游戏设计思路阐述 在设计游戏时,我们要充分考虑到剪刀石头布游戏的特性,以及多种技术的实现: ⑴构造创建服务器端和客户端 ⑵创建输入输出流 ⑶编写服务器端处 ...

最新文章

  1. 对联想乐Pad的十大期待
  2. 深入理解计算机系统9个重点笔记
  3. 未来计算机的缺陷,新技术将计算机芯片缺陷变为优势
  4. 【C语言简单说】二:第一个C语言程序详解(3)
  5. by截取字段 group_深入理解 group by【思考点滴】
  6. web服务器集群(多台web服务器)后session如何同步和共享
  7. 服务器iis如何开启tlsv1.2协议,Windows系统中IIS启用TLS 1.2
  8. 大道至简 读后有感
  9. 分布式架构中数据一致性常见的几个问题
  10. 开源分布式数据库 TiKV 入选 CNCF 云原生项目!
  11. 设计思想之高内聚低耦合
  12. 构建具有时间依存协变量的Elastic-net Cox模型
  13. PMP笔记(三)之项目整合管理
  14. 字符串库函数(1)Strlen,strcpy,strcat,strcmp
  15. 【tensorflow】conv2d/conv3d/maxpool2d/maxpool3d
  16. 评价星星三级样式:好、一般、差
  17. scite自动检测文件编码
  18. 代码审计:ourphp 后台任意文件读取复现
  19. AI Challenger 全球AI挑战赛[二]——场景分类比赛介绍(附数据集和基线模型百度云下载)
  20. 【论文笔记】ViLBERT:Pretraining Task-Agnostic VisiolinguisticRepresentations for Vision-and-Language Tasks

热门文章

  1. MAMP使用简单教程
  2. Selenium遇到的问题6 利用fiddler抓包工具,Host总是显示Tunnel to
  3. 从NTP网络授时到社交GPS千奇百怪的应用方式
  4. 舰船交流电网绝缘监测及故障定位的研究及产品选型
  5. Java语言程序设计基础篇-第10版-第一部分-程序设计基础)
  6. #Dell. R740服务器报错,显示找不到阵列卡驱动配置,按任意键,进入无限循环,在iDRAC管理卡看不到阵列卡以及硬盘信息
  7. 计算机网络——数据链路层之介质访问控制
  8. [渝粤教育] 西南科技大学 程序设计语言VB 在线考试复习资料
  9. 一名8年测试工程师,因为偷偷接私活被····
  10. python double free_double free or corruption的原因