`
zhong_qm
  • 浏览: 9955 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于骑士的游历的问题的Java实现

阅读更多

在编程语言中,有一个关于骑士的游历的问题,在棋盘中,马走日字,如何让马在不重复走任一点的情况下,遍历整个棋盘。如下图:



 
<!--EndFragment-->

在某一点,马最多有八种走法,如果直接用循环测试每一种走法是否可行是不行的,这样可能性太多,计算机速度跟不上。

这里我用了贪心策略来减少下一步走法的可能。下面是详细的介绍。

这里的贪心策略的意思是当马在A点时,它能不重复的情况下能走的点是B集合中的某个元素,那么如何确定是那个呢?是B集合中元素的点的走法的个数最小的那个。

这样,我们就需要一个方法,统计某点的走法,一个方法去得到下一个点的真正的走法,一个方法循环调用前两个方法,使每个点都能走到。

这里我们设置当棋盘为8*8的风格时。

代码实现如下:

设置两个一维数组和一个二维数组,分别代表行的增量(从当前点到下一点的数组的下标的差),列的增量,棋盘。如下:

//行与列的增量数组,考虑八个方向

private int[] AddRow=   {2,1,2,1,-2,-1,-2,-1};

private int[] AddColumn={1,2,-1,-2,1,2,-1,-2};

//用数组存储棋盘的点

private int Chess[][]=new int[8][8];

第一个方法:统计某点的可行的出口数目。

在这个方法中,用数组a存储到达这个出口的增量

马走到的点不能越界,也不能是已经走过的点

/**

 * 得到点(i,j)的出口数

 * @param i 行数

 * @param j 列数

 * @param a 不同的出口所用的增量的下标

 * @return  点(i,j)的出口个数

 */

public int getCount(int i,int j,int[] a){

//出口数

int count,k;

//检验不同的增量下的出口可行否

for(count=k=0;k<8;k++){

//得到下一个出口的座标

int i1=i+AddRow[k];

int j1=j+AddColumn[k];

//是否是出口 ,能则count加1,

if(i1>=0&&i1<8&&j1>=0&&j1<8&&Chess[i1][j1]==0){

a[count++]=k;

}

}

//得到出口数

return count;

}

 

第二个方法:利用得到的下一个出口数,比较下一个出口的出口数,选择最小的一个。

/**

 * 得到下一个要走的出口

 * @param i 点的行

 * @param j 点的列

 * @return 下一个出口所用的增量的数组下标

 */

public int getNext(int i,int j){

//最小出口数min,下一个出口所用的增量的数组下标minPoint

int min=9,minPoint = 0;

//存储出口下标的数组a

int[] a=new int[8];

//存储出口下标的数组b

int[] b=new int[8];

//得到点(i,j)的出口数

int m=getCount(i,j,a);

//如果没有出口

if(m==0){

return -1;

}

//得到下一个出口是最小出口数的增量数组的下标

for(int k=0;k<m;k++){

//得到下一个出口出口数

int temp=getCount(i+AddRow[a[k]],j+AddColumn[a[k]],b);

if(temp<min){

min=temp;

//下一个出口所用的增量的数组下标

minPoint=a[k];

}

}

 

return minPoint;

}

第三个方法:循环调用第二个方法,达到马要遍历棋盘的目的。

当马走到某点时,将该的元素设置为马的第几步,以改变初始值,

/**

 * 从某点开始考查

 * @param xi 行数

 * @param yj 列数

 */

public  void startCheck(int xi,int yj){

//设置行列i,j,步数step,出口所用的增量的数组下标num

int i = xi,j = yj,step,num;

//重设数组元素为0

for(int a=0;a<8;a++){

for(int b=0;b<8;b++){

Chess[a][b]=0;

}

}

//数组开始的点为1

Chess[i][j]=1;

//开始遍历每一个点

for(step=2;step<=64;step++){

//如果没有出口,跳出循环

if((num=getNext(i,j))==-1){

break;

}

//到下一个出口

i+=AddRow[num];

j+=AddColumn[num];

//设置些点是第几步

Chess[i][j]=step;

}

//如果符合完全遍历,打印

if(step==65){

for(int x=0;x<8;x++){

for(int y=0;y<8;y++){

System.out.print(Chess[x][y]+ ");

}

System.out.println();

System.out.println();

}

}

}

 

第四个方法:将不同的点作为马的起始点。

/**

 * 每一个点作为起点,进行遍历

 */

public void travelEveryOne(){

for(int i=0;i<8;i++){

for(int j=0;j<8;j++){

//调用遍历

startCheck(i,j);

System.out.println(i*8+j+1+"==================================" +i+

"================================");

}

}

}

 

 

这样,只要调用第四个方法,就能将马在不同的起始点下遍历整个棋盘的走法了。

某个走法如下截图:



 

 

<!--EndFragment-->
  • 大小: 3.6 KB
  • 大小: 22.3 KB
1
8
分享到:
评论

相关推荐

    骑士游历 java 实验 课程设计

    实现骑士游历的Java代码通常涉及深度优先搜索(DFS)或广度优先搜索(BFS)这两种算法。DFS是通过递归的方式探索所有可能的路径,而BFS则使用队列来保存待访问的节点,先访问距离起点近的节点,再逐渐扩展到更远的...

    kt.rar_java骑士游历_kt java_经典电路_骑士

    通过研究骑士游历的规则对问题进行数学模型抽象,通过研究骑士游历的方向与可到达情况,将骑士的空间移动抽象成数学表达式,进而映射到程序中所需对应的数据结构形式,最后通过利用JAVA语言得以实现骑士游历问题中...

    Java课程设计 骑士游历.rar

    Java课程设计中的“骑士游历”是一个经典的编程问题,它源于国际象棋的规则,旨在模拟棋盘上骑士的移动。骑士在8x8的棋盘上,每次移动按照L形路径,即两个单位沿一个方向,然后一个单位沿垂直或水平方向。目标是让...

    JAVA课程设计之骑士游历问题

    Java课程设计中的骑士游历问题是一个经典的计算机科学问题,它涉及到回溯算法的应用。骑士游历问题源自国际象棋,目标是找到一种方式,使得骑士可以在标准的8x8棋盘上走过每一个格子且仅走过一次。在这个问题中,...

    骑士游历 java实现 启发式算法

    ### 骑士游历问题及其Java实现 #### 一、骑士游历问题概述 骑士游历问题是国际象棋中的一个经典问题,它要求骑士从棋盘上的某个方格出发,按照骑士移动的方式(即“日”字形,横两格竖一格或横一格竖两格),走过...

    Java骑士游历(课程设计)

    【Java骑士游历(课程设计)】是一款基于Java编程语言开发的小游戏,旨在帮助学习者理解和实践面向对象编程、算法设计以及游戏逻辑实现。在这个项目中,玩家将扮演一名骑士,要在棋盘上进行特定的移动,模拟了国际...

    骑士游历程序的开发,java课程设计源代码

    骑士游历程序是一种基于计算机科学的算法实现,它源于国际象棋中的骑士移动规则。骑士在棋盘上每次可以移动两格横向或纵向,再移动一格横向或纵向,形成"L"形路径。在编程中,骑士游历问题通常是为了展示回溯法或者...

    骑士游历程序的开发 java

    本项目聚焦于“骑士游历”这一特定主题,通过Java来实现,这既是一个编程挑战,也是对算法理解和逻辑思维的锻炼。 骑士游历问题源自国际象棋,它涉及到一个假设的骑士在棋盘上移动,目标是访问每一个格子恰好一次。...

    骑士游历java课程设计.doc

    总结,骑士游历Java课程设计是一个综合性的项目,涵盖了数据结构、算法、图形界面设计等多个方面,对于提升学生的编程能力和问题解决能力具有显著效果。源代码的编写和调试过程,将进一步强化学生的编程实践技能,使...

    KnighTour 骑士游历原代码

    总的来说,骑士游历问题的Java实现不仅让我们深入了解了回溯算法和DFS,也锻炼了我们的编程技巧和问题解决能力。在Eclipse这样的专业开发环境中,我们能够更高效地进行代码编写和调试,进一步提升编程实践水平。

    dk.rar_Knight Java_骑士_骑士游历

    《骑士游历程序》是专为Java初学者设计的一款编程挑战,它涉及到计算机科学中的一个重要概念——图论,以及在编程中的实现。骑士游历问题源自国际象棋,旨在探索棋盘上骑士如何能访问到每一个格子至少一次。在这个...

    运行速度比较快的骑士问题(马周游问题)的Java源程序

    运行速度比较快的骑士问题(马周游问题)的Java源程序,配合GUI,显示整个回溯过程!

    qishiyouli.rar_java骑士游历_骑士

    【Java骑士游历】是一款专为Java初学者设计的小游戏,旨在通过编程实践来帮助学习者更好地理解和掌握Java编程语言的基础知识。在这个游戏中,玩家扮演一名骑士,通过编写代码来控制骑士在虚拟世界中的行动,解决一...

    骑士游历程序的开发(JAVA语言)

    通过上述方法,该程序能够有效地实现骑士游历问题的求解,并以直观的方式展示结果。此外,项目还涉及了其他关键组成部分,例如图形用户界面的设计和实现等,这将进一步丰富项目的功能性和用户体验。

    java课程设计--骑士游历程序的开发.doc

    程序主要由三个类构成:AccessibleSquare类代表棋盘上的每个格子,MyPanel类负责绘制棋盘和骑士的移动,而KnightsTour类则是整个程序的核心,包含了骑士游历问题的算法实现。这些类之间通过方法调用和数据传递协同...

    java编程游戏之骑士游历.doc

    java编程游戏之骑士游历

    骑士游历问题算法的研究

    通过研究骑士游历的规则对问题进行数学模型抽象,通过研究骑士游历的方向与可到达情况,将骑士的空间移动抽象成数学表达式,进而映射到程序中所需对应的数据结构形式,最后通过利用JAVA语言得以实现骑士游历问题中...

    JAVA程序设计 游历程序的开发课程设计报告

    此处列出的参考文献可能包括关于Java编程、图形化界面设计、算法分析以及骑士游历问题的专业书籍和在线资源。 【附录】 附录1提供了完整的源代码,供教师评估和学生参考。附录2则包含程序运行的截图,直观展示了...

    《JAVA课程设计》--骑士游历Java版,数据结构课程设计.zip

    本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~ 本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做...

    骑士巡游word文档

    在骑士游历问题的实现中,多线程可以用来提高程序的性能,比如在不同的线程中分别处理不同的任务,如算法计算、图形渲染等,从而使得程序更加高效、流畅。 综上所述,本课程设计不仅涉及到了 Java 编程的基本知识和...

Global site tag (gtag.js) - Google Analytics