在编程语言中,有一个关于骑士的游历的问题,在棋盘中,马走日字,如何让马在不重复走任一点的情况下,遍历整个棋盘。如下图:
<!--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
分享到:
相关推荐
实现骑士游历的Java代码通常涉及深度优先搜索(DFS)或广度优先搜索(BFS)这两种算法。DFS是通过递归的方式探索所有可能的路径,而BFS则使用队列来保存待访问的节点,先访问距离起点近的节点,再逐渐扩展到更远的...
通过研究骑士游历的规则对问题进行数学模型抽象,通过研究骑士游历的方向与可到达情况,将骑士的空间移动抽象成数学表达式,进而映射到程序中所需对应的数据结构形式,最后通过利用JAVA语言得以实现骑士游历问题中...
Java课程设计中的“骑士游历”是一个经典的编程问题,它源于国际象棋的规则,旨在模拟棋盘上骑士的移动。骑士在8x8的棋盘上,每次移动按照L形路径,即两个单位沿一个方向,然后一个单位沿垂直或水平方向。目标是让...
Java课程设计中的骑士游历问题是一个经典的计算机科学问题,它涉及到回溯算法的应用。骑士游历问题源自国际象棋,目标是找到一种方式,使得骑士可以在标准的8x8棋盘上走过每一个格子且仅走过一次。在这个问题中,...
### 骑士游历问题及其Java实现 #### 一、骑士游历问题概述 骑士游历问题是国际象棋中的一个经典问题,它要求骑士从棋盘上的某个方格出发,按照骑士移动的方式(即“日”字形,横两格竖一格或横一格竖两格),走过...
【Java骑士游历(课程设计)】是一款基于Java编程语言开发的小游戏,旨在帮助学习者理解和实践面向对象编程、算法设计以及游戏逻辑实现。在这个项目中,玩家将扮演一名骑士,要在棋盘上进行特定的移动,模拟了国际...
骑士游历程序是一种基于计算机科学的算法实现,它源于国际象棋中的骑士移动规则。骑士在棋盘上每次可以移动两格横向或纵向,再移动一格横向或纵向,形成"L"形路径。在编程中,骑士游历问题通常是为了展示回溯法或者...
本项目聚焦于“骑士游历”这一特定主题,通过Java来实现,这既是一个编程挑战,也是对算法理解和逻辑思维的锻炼。 骑士游历问题源自国际象棋,它涉及到一个假设的骑士在棋盘上移动,目标是访问每一个格子恰好一次。...
总结,骑士游历Java课程设计是一个综合性的项目,涵盖了数据结构、算法、图形界面设计等多个方面,对于提升学生的编程能力和问题解决能力具有显著效果。源代码的编写和调试过程,将进一步强化学生的编程实践技能,使...
总的来说,骑士游历问题的Java实现不仅让我们深入了解了回溯算法和DFS,也锻炼了我们的编程技巧和问题解决能力。在Eclipse这样的专业开发环境中,我们能够更高效地进行代码编写和调试,进一步提升编程实践水平。
《骑士游历程序》是专为Java初学者设计的一款编程挑战,它涉及到计算机科学中的一个重要概念——图论,以及在编程中的实现。骑士游历问题源自国际象棋,旨在探索棋盘上骑士如何能访问到每一个格子至少一次。在这个...
运行速度比较快的骑士问题(马周游问题)的Java源程序,配合GUI,显示整个回溯过程!
【Java骑士游历】是一款专为Java初学者设计的小游戏,旨在通过编程实践来帮助学习者更好地理解和掌握Java编程语言的基础知识。在这个游戏中,玩家扮演一名骑士,通过编写代码来控制骑士在虚拟世界中的行动,解决一...
通过上述方法,该程序能够有效地实现骑士游历问题的求解,并以直观的方式展示结果。此外,项目还涉及了其他关键组成部分,例如图形用户界面的设计和实现等,这将进一步丰富项目的功能性和用户体验。
程序主要由三个类构成:AccessibleSquare类代表棋盘上的每个格子,MyPanel类负责绘制棋盘和骑士的移动,而KnightsTour类则是整个程序的核心,包含了骑士游历问题的算法实现。这些类之间通过方法调用和数据传递协同...
java编程游戏之骑士游历
通过研究骑士游历的规则对问题进行数学模型抽象,通过研究骑士游历的方向与可到达情况,将骑士的空间移动抽象成数学表达式,进而映射到程序中所需对应的数据结构形式,最后通过利用JAVA语言得以实现骑士游历问题中...
此处列出的参考文献可能包括关于Java编程、图形化界面设计、算法分析以及骑士游历问题的专业书籍和在线资源。 【附录】 附录1提供了完整的源代码,供教师评估和学生参考。附录2则包含程序运行的截图,直观展示了...
本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~ 本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做...
在骑士游历问题的实现中,多线程可以用来提高程序的性能,比如在不同的线程中分别处理不同的任务,如算法计算、图形渲染等,从而使得程序更加高效、流畅。 综上所述,本课程设计不仅涉及到了 Java 编程的基本知识和...