package gao;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
public class KnightsTour extends JApplet {
public static int access[][] = {
{2,3,4,4,4,4,3,2},
{3,4,6,6,6,6,4,3},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{3,4,6,6,6,6,4,3},
{2,3,4,4,4,4,3,2}};
public static int accessbak[][] = arrayCopy ( access ) ;
// the value indicate the No.value moving
int countMoving = -1 ;
int tourXpos [] = new int [ 64 ];
int tourYpos [] = new int [ 64 ];
private int recordXpos [][];
private int recordYpos [][];
private int recordCount = - 1 ;
private int startx ;
private int starty ;
private boolean success = false;
MyPanel myPanel ;
public void tour ( int xpos ,int ypos ){
// int x,y;
countMoving ++ ;
//all the 64 squares has been touch , return
if (countMoving == 63 )
{
tourXpos [ countMoving ] = xpos ;
tourYpos [ countMoving ] = ypos ;
// if ( ( ( Math.abs( xpos -startx ) == 1) & ( Math.abs ( ypos - starty ) ==2 ) ) |
// ( ( Math.abs( xpos -startx ) == 2) & ( Math.abs ( ypos - starty ) ==1 ) ) )
success = true ;
countMoving -- ;
return ;
}
AccessibleSquares nextSquare = new AccessibleSquares( xpos, ypos );
while (nextSquare.hasMoreAccessible())
{
// do moving
nextSquare.domoving();
//record this moving
tourXpos [ countMoving ] = xpos ;
tourYpos [ countMoving ] = ypos ;
// try the next moving
nextSquare.nextAccessible();
tour ( nextSquare.getXpos() , nextSquare.getYpos() );
//all the 64 squares has been touch , return
if ( success )
{
countMoving -- ;
return ;
}
//this moving try is a faillure, pick it up from the chess board
nextSquare.undomoving();
}// end of while
countMoving -- ;
}//end of tour method
public static int[] arrayCopy ( int array1[] )
{
int[]array2 = new int [array1.length];
for ( int row = 0 ; row < array1.length ; row ++ )
{
array2 [ row ] = array1 [ row ] ;
};
return array2;
}
public static int[][] arrayCopy ( int array1[][] )
{
int[][] array2 = new int [array1.length][array1[0].length];
for ( int row = 0 ; row < array1.length ; row ++ )
{
for ( int column = 0 ; column < array1[0].length ; column ++ )
{
array2 [ row ][ column ] = array1 [ row ][ column ];
};
};
return array2;
}
public void initialArray ( int chessBoard[][] )
{
for ( int row = 0 ; row < 8 ; row ++ )
{
for ( int column = 0 ; column < 8 ; column ++ )
{
chessBoard [ row ][ column ] = 0 ;
};
};
}
/* public static void main( String args[] ) {
KnightsTour application = new KnightsTour();
application.tour( 0 , 0 );
}
*/
public void init () {
recordCount = -1 ;
recordXpos = new int [ 64 ][ 64 ] ;
recordYpos = new int [ 64 ][ 64 ] ;
for (int row = 0 ; row < 8 ;row ++){
for ( int column = 0 ; column < 8 ; column ++ ){
success = false ;
countMoving = -1;
startx = row ;
starty = column ;
access = arrayCopy ( accessbak );
tour ( row ,column );
recordCount ++ ;
recordXpos [ recordCount ] = arrayCopy ( tourXpos ) ;
recordYpos [ recordCount ] = arrayCopy ( tourYpos ) ;
}
}
recordCount = 0 ;
myPanel = new MyPanel( recordXpos [ 0 ] ,recordYpos [ 0 ]) ;
JPanel buttonPanel = new JPanel();
JButton nextMoving = new JButton( "Next Moving" );
JButton nextTour = new JButton( "Next Tour" );
buttonPanel.add( nextTour );
buttonPanel.add( nextMoving );
getContentPane().add( buttonPanel, BorderLayout.SOUTH );
getContentPane().add( myPanel );
nextMoving.addActionListener(
//anonymous inner class
new ActionListener() {
public void actionPerformed ( ActionEvent e ) {
myPanel.showNext() ;
}
}
);//end call to addActionListener
nextTour.addActionListener(
//anonymous inner class
new ActionListener() {
public void actionPerformed ( ActionEvent e ) {
if ( recordCount < recordXpos.length - 1 ) {
recordCount ++ ;
} else {
recordCount = 0 ;
}
myPanel.initboard ( recordXpos [ recordCount ] , recordYpos [ recordCount ] );
myPanel.repaint();
}
}
);//end call to addActionListener
}
public void paint (Graphics g )
{
super.paint( g );
}
}//end of class KnightsTour
class AccessibleSquares {
private static int horizontal[] = {2,1,-1,-2,-2,-1,1,2};
private static int vertical [] = {-1,-2,-2,-1,1,2,2,1};
private int xpos[] ;
private int ypos[] ;
private int accessibility [];
private int ownxpos ,ownypos ;
private int ownAccessibility ;
private int arrayPos ;
private int countAccessibility;
public AccessibleSquares(int x , int y ){
int testXPos;
int testYPos;
xpos = new int [ 8 ];
ypos = new int [ 8 ];
accessibility = new int [ 8 ];
arrayPos = 0 ;
ownxpos = x ;
ownypos = y ;
ownAccessibility = KnightsTour.access[ x ][ y ];
for (int i = 0 ; i < horizontal.length ; i++ ){
testXPos = x + horizontal[ i ];
testYPos = y + vertical [ i ];
if ( (testXPos >= 0 ) & ( testXPos < 8 ) &
(testYPos >= 0 ) & ( testYPos < 8 ) ) {
xpos [ arrayPos ] = testXPos ;
ypos [ arrayPos ] = testYPos ;
accessibility [ arrayPos ] = KnightsTour.access [testXPos][testYPos];
//because accessibility [ arrayPos ] = 0 indicating the square has been occupied
if (accessibility [ arrayPos ] > 0 )
arrayPos ++ ;
}//end of if
}// end of for
countAccessibility = arrayPos ;
if (countAccessibility > 0 )
{sortAll();}
arrayPos = -1 ;
}// end of constructor
public boolean hasMoreAccessible(){
// arrayPos + 1 point to the next accessible
if ( (arrayPos + 1 ) < countAccessibility ){
return true;
}else {
return false;
}
}//end of the hasMoreAccessible()
public AccessibleSquares nextAccessible(){
arrayPos ++ ;
return this;
}
public AccessibleSquares accessibleAt( int pos){
if ((pos >= 0) & (pos < countAccessibility ))
arrayPos = pos ;
return this;
}
public int getXpos(){
return xpos[ arrayPos ];
}
public int getYpos(){
return ypos[ arrayPos ];
}
public int getAccessibility(){
return accessibility[ arrayPos ];
}
public int getTotalAccessible(){
return countAccessibility;
}
//bubble sorting
private void sortAll (){
for ( int begin = 0 ; begin < countAccessibility - 1 ; begin ++ ){
for ( int i = begin + 1; i < countAccessibility ; i ++ ){
if ( accessibility [ begin ] > accessibility [ i ] ){
swapAll( begin, i );
}//end of if
}// end of inner for
}// end of outer for
}// end of sortAll
private void swapAll ( int i , int j ){
int temp ;
temp = xpos [ i ];
xpos [ i ] = xpos [ j ];
xpos [ j ] = temp;
temp = ypos [ i ];
ypos [ i ] = ypos [ j ];
ypos [ j ] = temp;
temp = accessibility [ i ];
accessibility [ i ] = accessibility [ j ];
accessibility [ j ] = temp;
}
骑士游历程序的开发,java课程设计源代码
需积分: 9 83 浏览量
2011-01-04
15:34:53
上传
评论 1
收藏 63KB RAR 举报
seiferyxd
- 粉丝: 4
- 资源: 7
最新资源
- ### 词向量的介绍、使用技巧和优缺点的文章
- 基于STM32F103CBT6单片机GC65+MP2625+CC1101 GPSTrack模块板硬件(原理图+PCB)工程文件
- ### 通道处理过程模拟概念、优缺点和使用技巧
- ### MyBatis动态SQL介绍说明、使用技巧和优缺点
- 上传下载仿163网盘无刷新文件上传 for Jsp-fileupload-jsp.rar
- VMware Workstation业界非常稳定且安全的桌面虚拟机软件-计算机上运行多个操作系统,支持Windows、DOS等
- 基于STM8L101F3P6单片机+LY2508A33P+CC1100遥控器硬件(原理图+PCB)工程文件.zip
- 上传下载WAP图铃下载系统-unimg.rar
- YTX-0.1.0-Win
- 上传下载ExtJS 2.2 开源网络硬盘系统-dogdisk.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈