KnightsTour.java~1~
上传用户:liming9091
上传日期:2014-10-27
资源大小:3376k
文件大小:6k
源码类别:

Java编程

开发平台:

Java

  1. package gao;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. import java.awt.image.*;
  6. public class KnightsTour extends JApplet {
  7.    public static int access[][] = {
  8.       {2,3,4,4,4,4,3,2},
  9.       {3,4,6,6,6,6,4,3},
  10.       {4,6,8,8,8,8,6,4},
  11.       {4,6,8,8,8,8,6,4},
  12.       {4,6,8,8,8,8,6,4},
  13.       {4,6,8,8,8,8,6,4},
  14.       {3,4,6,6,6,6,4,3},
  15.       {2,3,4,4,4,4,3,2}};
  16.    // the value indicate the No.value moving
  17.    int chessboard [][] = new int[ 8 ][ 8 ];
  18.    int countMoving = -1 ;
  19.    int tourXpos [] = new int [ 64 ];
  20.    int tourYpos [] = new int [ 64 ];
  21.    private int tourRecordXpos [][];
  22.    private boolean success = false;
  23.    public void tour ( int xpos ,int ypos ){
  24. //      int x,y;
  25.       countMoving ++ ;
  26.       //all the  64 squares has been touch , return
  27.       if (countMoving == 63 )
  28.       {
  29.          tourXpos [ countMoving ] = xpos ;
  30.          tourYpos [ countMoving ] = ypos ;
  31.          success = true ;
  32.          countMoving -- ;
  33.          return ;
  34.       }
  35.       AccessibleSquares nextSquare = new AccessibleSquares( xpos, ypos );
  36.       while (nextSquare.hasMoreAccessible())
  37.       {
  38.          // do moving
  39.          nextSquare.domoving();
  40.          //record this moving
  41.          tourXpos [ countMoving ] = xpos ;
  42.          tourYpos [ countMoving ] = ypos ;
  43.          // try the next moving
  44.          nextSquare.nextAccessible();
  45.          tour ( nextSquare.getXpos() , nextSquare.getYpos() );
  46.          //all the  64 squares has been touch , return
  47.          if ( success )
  48.          {
  49.             countMoving -- ;
  50.             return ;
  51.          }
  52.          //this moving try is a faillure, pick it up from the chess board
  53.          nextSquare.undomoving();
  54.       }// end of while
  55.       countMoving -- ;
  56.    }//end of tour method
  57. /*   public static void main( String args[] ) {
  58.       KnightsTour application = new KnightsTour();
  59.       application.tour( 0 , 0 );
  60.    }
  61. */
  62.    public void init () {
  63.       for (int row = 0 ; row < 8 ;row ++){
  64.          for ( int column = 0 ; column < 8 ; column ++ ){
  65.             success = false ;
  66.             countMoving = -1;
  67.             tour ( row ,column );
  68.          }
  69.       }
  70.    }
  71.    public void paint (Graphics g )
  72.    {
  73.       super.paint( g );
  74.       //draw the cheess board
  75. /*      for (int row = 0 ; row < 8 ;row ++){
  76.          for ( int column = 0 ; column < 8 ; column ++ ){
  77.             success = false ;
  78.             tour ( row ,column );
  79.          }
  80.       }*/
  81. //      tour ( 7 , 0 );
  82.       for ( int row = 0 ; row < 9 ; row ++ )
  83.       {
  84.          g.drawLine( 10 , 10 + 32 * row , 32 * 8 + 10 , 10 + 32 * row  );
  85.       }
  86.       for ( int column = 0 ; column < 9 ; column ++ )
  87.       {
  88.          g.drawLine( 10 + 32 * column , 10  , 10 + 32 * column , 32 * 8 + 10 );
  89.       };
  90.       for ( int count = 0 ; count < tourXpos.length ; count ++ )
  91.       {
  92.          g.drawString("" + count , 26 + 32 * tourXpos[ count ] ,32 + 32 * tourYpos [ count ] );
  93.       };
  94.    ///  BufferedImage white = new BufferedImage ( "white.jpg");
  95.    }
  96. }//end of class KnightsTour
  97. class AccessibleSquares {
  98.    private static int horizontal[] = {2,1,-1,-2,-2,-1,1,2};
  99.    private static int vertical  [] = {-1,-2,-2,-1,1,2,2,1};
  100.    private int xpos[] ;
  101.    private int ypos[] ;
  102.    private int accessibility [];
  103.    private int ownxpos ,ownypos ;
  104.    private int ownAccessibility ;
  105.    private int arrayPos ;
  106.    private int countAccessibility;
  107.    public AccessibleSquares(int x , int y ){
  108.       int testXPos;
  109.       int testYPos;
  110.       xpos = new int [ 8 ];
  111.       ypos = new int [ 8 ];
  112.       accessibility = new int [ 8 ];
  113.       arrayPos = 0 ;
  114.       ownxpos = x ;
  115.       ownypos = y ;
  116.       ownAccessibility = KnightsTour.access[ x ][ y ];
  117.       for (int i = 0 ; i < horizontal.length ; i++ ){
  118.          testXPos = x + horizontal[ i ];
  119.          testYPos = y + vertical  [ i ];
  120.          if ( (testXPos >= 0 ) & ( testXPos < 8 ) &
  121.               (testYPos >= 0 ) & ( testYPos < 8 ) ) {
  122.             xpos [ arrayPos ] = testXPos ;
  123.             ypos [ arrayPos ] = testYPos ;
  124.             accessibility [ arrayPos ] = KnightsTour.access [testXPos][testYPos];
  125.             //because  accessibility [ arrayPos ] = 0 indicating the square has been occupied
  126.             if (accessibility [ arrayPos ] > 0 )
  127.                arrayPos ++ ;
  128.          }//end of if
  129.       }// end of for
  130.       countAccessibility = arrayPos ;
  131.       if (countAccessibility > 0 )
  132.          {sortAll();}
  133.       arrayPos = -1 ;
  134.    }// end of constructor
  135.    public boolean hasMoreAccessible(){
  136.       // arrayPos + 1 point to the next accessible
  137.       if ( (arrayPos + 1 ) < countAccessibility ){
  138.          return true;
  139.       }else {
  140.          return false;
  141.       }
  142.    }//end of the hasMoreAccessible()
  143.    public AccessibleSquares nextAccessible(){
  144.       arrayPos ++ ;
  145.       return this;
  146.    }
  147.    public AccessibleSquares accessibleAt( int pos){
  148.       if ((pos >= 0) & (pos < countAccessibility ))
  149.       arrayPos = pos ;
  150.       return this;
  151.    }
  152.    public int getXpos(){
  153.       return xpos[ arrayPos ];
  154.    }
  155.    public int getYpos(){
  156.       return ypos[ arrayPos ];
  157.    }
  158.    public int getAccessibility(){
  159.       return accessibility[ arrayPos ];
  160.    }
  161.    public int getTotalAccessible(){
  162.       return countAccessibility;
  163.    }
  164.    //bubble sorting
  165.    private void sortAll (){
  166.       for ( int begin = 0 ; begin < countAccessibility - 1 ; begin ++ ){
  167.          for ( int i = begin + 1; i < countAccessibility ; i ++ ){
  168.             if ( accessibility [ begin ] > accessibility [ i ] ){
  169.                swapAll( begin, i );
  170.             }//end of if
  171.          }// end of inner for
  172.       }// end of outer for
  173.    }// end of sortAll
  174.    private void swapAll ( int i , int j ){
  175.       int temp ;
  176.       temp = xpos [ i ];
  177.       xpos [ i ] = xpos [ j ];
  178.       xpos [ j ] = temp;
  179.       temp = ypos [ i ];
  180.       ypos [ i ] = ypos [ j ];
  181.       ypos [ j ] = temp;
  182.       temp = accessibility [ i ];
  183.       accessibility [ i ] = accessibility [ j ];
  184.       accessibility [ j ] = temp;
  185.    }
  186.    public void domoving(){
  187.       for ( int i = 0 ; i < countAccessibility ; i ++ ){
  188.          KnightsTour.access[ xpos [i] ][ ypos[i] ] -- ;
  189.       }
  190.        KnightsTour.access[ ownxpos ][ ownypos ] = 0 ;
  191.    }
  192.    public void undomoving(){
  193.       for ( int i = 0 ; i < countAccessibility ; i ++ ){
  194.          KnightsTour.access[ xpos [i] ][ ypos[i] ] ++ ;
  195.       }
  196.       KnightsTour.access[ ownxpos ][ ownypos ] = ownAccessibility ;
  197.    }
  198. }