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

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.    public static int accessbak[][] = arrayCopy ( access ) ;
  17.    // the value indicate the No.value moving
  18.    int countMoving = -1 ;
  19.    int tourXpos [] = new int [ 64 ];
  20.    int tourYpos [] = new int [ 64 ];
  21.    private int recordXpos [][];
  22.    private int recordYpos [][];
  23.    private int recordCount = - 1 ;
  24.    private int startx ;
  25.    private int starty ;
  26.    private boolean success = false;
  27.    MyPanel myPanel ;
  28.    public void tour ( int xpos ,int ypos ){
  29. //      int x,y;
  30.       countMoving ++ ;
  31.       //all the  64 squares has been touch , return
  32.       if (countMoving == 63 )
  33.       {
  34.          tourXpos [ countMoving ] = xpos ;
  35.          tourYpos [ countMoving ] = ypos ;
  36. //         if ( ( ( Math.abs( xpos -startx ) == 1)  & ( Math.abs ( ypos - starty ) ==2 ) ) |
  37.   //            ( ( Math.abs( xpos -startx ) == 2)  & ( Math.abs ( ypos - starty ) ==1 ) ) )
  38.          success = true ;
  39.          countMoving -- ;
  40.          return ;
  41.       }
  42.       AccessibleSquares nextSquare = new AccessibleSquares( xpos, ypos );
  43.       while (nextSquare.hasMoreAccessible())
  44.       {
  45.          // do moving
  46.          nextSquare.domoving();
  47.          //record this moving
  48.          tourXpos [ countMoving ] = xpos ;
  49.          tourYpos [ countMoving ] = ypos ;
  50.          // try the next moving
  51.          nextSquare.nextAccessible();
  52.          tour ( nextSquare.getXpos() , nextSquare.getYpos() );
  53.          //all the  64 squares has been touch , return
  54.          if ( success )
  55.          {
  56.             countMoving -- ;
  57.             return ;
  58.          }
  59.          //this moving try is a faillure, pick it up from the chess board
  60.          nextSquare.undomoving();
  61.       }// end of while
  62.       countMoving -- ;
  63.    }//end of tour method
  64.    public static int[] arrayCopy ( int array1[] )
  65.    {
  66.      int[]array2 = new int [array1.length];
  67.      for ( int row = 0 ; row < array1.length ; row ++ )
  68.      {
  69.           array2 [ row ] = array1  [ row ] ;
  70.      };
  71.      return array2;
  72.    }
  73.    public static int[][] arrayCopy ( int array1[][]  )
  74.    {
  75.       int[][] array2 = new int [array1.length][array1[0].length];
  76.      for ( int row = 0 ; row < array1.length ; row ++ )
  77.      {
  78.         for ( int column = 0 ; column < array1[0].length ; column ++ )
  79.         {
  80.           array2 [ row ][ column ] = array1  [ row ][ column ];
  81.         };
  82.      };
  83.      return array2;
  84.    }
  85.    public void initialArray ( int chessBoard[][]  )
  86.    {
  87.      for ( int row = 0 ; row < 8 ; row ++ )
  88.      {
  89.         for ( int column = 0 ; column < 8 ; column ++ )
  90.         {
  91.           chessBoard [ row ][ column ] = 0 ;
  92.         };
  93.      };
  94.    }
  95. /*   public static void main( String args[] ) {
  96.       KnightsTour application = new KnightsTour();
  97.       application.tour( 0 , 0 );
  98.    }
  99. */
  100.    public void init () {
  101.       recordCount = -1 ;
  102.       recordXpos = new int [ 64 ][ 64 ] ;
  103.       recordYpos = new int [ 64 ][ 64 ] ;
  104.       for (int row = 0 ; row < 8 ;row ++){
  105.          for ( int column = 0 ; column < 8 ; column ++ ){
  106.             success = false ;
  107.             countMoving = -1;
  108.             startx = row ;
  109.             starty = column ;
  110.             access = arrayCopy ( accessbak );
  111.             tour ( row ,column );
  112.             recordCount ++ ;
  113.             recordXpos [ recordCount ] = arrayCopy ( tourXpos ) ;
  114.             recordYpos [ recordCount ] = arrayCopy ( tourYpos ) ;
  115.          }
  116.       }
  117.       recordCount = 0 ;
  118.       myPanel = new MyPanel( recordXpos [ 0 ] ,recordYpos [ 0 ]) ;
  119.       JPanel buttonPanel = new JPanel();
  120.       JButton nextMoving = new JButton( "Next Moving" );
  121.       JButton nextTour = new JButton( "Next Tour" );
  122.       buttonPanel.add( nextTour );
  123.       buttonPanel.add( nextMoving );
  124.       getContentPane().add( buttonPanel, BorderLayout.SOUTH );
  125.       getContentPane().add( myPanel );
  126.       nextMoving.addActionListener(
  127.          //anonymous inner class
  128.          new ActionListener() {
  129.             public void actionPerformed ( ActionEvent e ) {
  130.                myPanel.showNext() ;
  131.             }
  132.          }
  133.          );//end call to addActionListener
  134.          nextTour.addActionListener(
  135.             //anonymous inner class
  136.             new ActionListener() {
  137.                public void actionPerformed ( ActionEvent e ) {
  138.                   if ( recordCount < recordXpos.length - 1 ) {
  139.                      recordCount ++ ;
  140.                   } else {
  141.                      recordCount = 0 ;
  142.                   }
  143.                   myPanel.initboard ( recordXpos [ recordCount ] , recordYpos [ recordCount ] );
  144.                   myPanel.repaint();
  145.                }
  146.             }
  147.             );//end call to addActionListener
  148.    }
  149.    public void paint (Graphics g )
  150.    {
  151.       super.paint( g );
  152.    }
  153. }//end of class KnightsTour
  154. class AccessibleSquares {
  155.    private static int horizontal[] = {2,1,-1,-2,-2,-1,1,2};
  156.    private static int vertical  [] = {-1,-2,-2,-1,1,2,2,1};
  157.    private int xpos[] ;
  158.    private int ypos[] ;
  159.    private int accessibility [];
  160.    private int ownxpos ,ownypos ;
  161.    private int ownAccessibility ;
  162.    private int arrayPos ;
  163.    private int countAccessibility;
  164.    public AccessibleSquares(int x , int y ){
  165.       int testXPos;
  166.       int testYPos;
  167.       xpos = new int [ 8 ];
  168.       ypos = new int [ 8 ];
  169.       accessibility = new int [ 8 ];
  170.       arrayPos = 0 ;
  171.       ownxpos = x ;
  172.       ownypos = y ;
  173.       ownAccessibility = KnightsTour.access[ x ][ y ];
  174.       for (int i = 0 ; i < horizontal.length ; i++ ){
  175.          testXPos = x + horizontal[ i ];
  176.          testYPos = y + vertical  [ i ];
  177.          if ( (testXPos >= 0 ) & ( testXPos < 8 ) &
  178.               (testYPos >= 0 ) & ( testYPos < 8 ) ) {
  179.             xpos [ arrayPos ] = testXPos ;
  180.             ypos [ arrayPos ] = testYPos ;
  181.             accessibility [ arrayPos ] = KnightsTour.access [testXPos][testYPos];
  182.             //because  accessibility [ arrayPos ] = 0 indicating the square has been occupied
  183.             if (accessibility [ arrayPos ] > 0 )
  184.                arrayPos ++ ;
  185.          }//end of if
  186.       }// end of for
  187.       countAccessibility = arrayPos ;
  188.       if (countAccessibility > 0 )
  189.          {sortAll();}
  190.       arrayPos = -1 ;
  191.    }// end of constructor
  192.    public boolean hasMoreAccessible(){
  193.       // arrayPos + 1 point to the next accessible
  194.       if ( (arrayPos + 1 ) < countAccessibility ){
  195.          return true;
  196.       }else {
  197.          return false;
  198.       }
  199.    }//end of the hasMoreAccessible()
  200.    public AccessibleSquares nextAccessible(){
  201.       arrayPos ++ ;
  202.       return this;
  203.    }
  204.    public AccessibleSquares accessibleAt( int pos){
  205.       if ((pos >= 0) & (pos < countAccessibility ))
  206.       arrayPos = pos ;
  207.       return this;
  208.    }
  209.    public int getXpos(){
  210.       return xpos[ arrayPos ];
  211.    }
  212.    public int getYpos(){
  213.       return ypos[ arrayPos ];
  214.    }
  215.    public int getAccessibility(){
  216.       return accessibility[ arrayPos ];
  217.    }
  218.    public int getTotalAccessible(){
  219.       return countAccessibility;
  220.    }
  221.    //bubble sorting
  222.    private void sortAll (){
  223.       for ( int begin = 0 ; begin < countAccessibility - 1 ; begin ++ ){
  224.          for ( int i = begin + 1; i < countAccessibility ; i ++ ){
  225.             if ( accessibility [ begin ] > accessibility [ i ] ){
  226.                swapAll( begin, i );
  227.             }//end of if
  228.          }// end of inner for
  229.       }// end of outer for
  230.    }// end of sortAll
  231.    private void swapAll ( int i , int j ){
  232.       int temp ;
  233.       temp = xpos [ i ];
  234.       xpos [ i ] = xpos [ j ];
  235.       xpos [ j ] = temp;
  236.       temp = ypos [ i ];
  237.       ypos [ i ] = ypos [ j ];
  238.       ypos [ j ] = temp;
  239.       temp = accessibility [ i ];
  240.       accessibility [ i ] = accessibility [ j ];
  241.       accessibility [ j ] = temp;
  242.    }
  243.    public void domoving(){
  244.       for ( int i = 0 ; i < countAccessibility ; i ++ ){
  245.          KnightsTour.access[ xpos [i] ][ ypos[i] ] -- ;
  246.       }
  247.        KnightsTour.access[ ownxpos ][ ownypos ] = 0 ;
  248.    }
  249.    public void undomoving(){
  250.       for ( int i = 0 ; i < countAccessibility ; i ++ ){
  251.          KnightsTour.access[ xpos [i] ][ ypos[i] ] ++ ;
  252.       }
  253.       KnightsTour.access[ ownxpos ][ ownypos ] = ownAccessibility ;
  254.    }
  255. }
  256. class MyPanel extends JPanel {
  257.    public static final int WHITE = 0 ;
  258.    public static final int BLACK = 1 ;
  259.    public static final int WKNIGHT = 2 ;
  260.    public static final int BKNIGHT = 3 ;
  261.    private int chessboard[][];
  262.    private int xrecord [] ;
  263.    private int yrecord [] ;
  264.    private int displayCount ;
  265.    private int lastxpos ,lastypos ,nextxpos ,nextypos ;
  266.    ImageIcon images[] ;
  267.    private boolean start ;
  268.    public MyPanel() {
  269.       initvariance();
  270.    }
  271.    public MyPanel( int [] newxrecord ,int [] newyrecord ) {
  272.       initvariance();
  273.       initboard( newxrecord , newyrecord );
  274.    }
  275.    public void initvariance () {
  276.       chessboard = new int[ 8 ][ 8 ];
  277.       xrecord = new int [ 64 ] ;
  278.       yrecord = new int [ 64 ];
  279.       images = new ImageIcon [ 4 ];
  280.       images[ 0 ] = new ImageIcon( "white.jpg");
  281.       images[ 1 ] = new ImageIcon( "black.jpg");
  282.       images[ 2 ] = new ImageIcon( "wknight.jpg");
  283.       images[ 3 ] = new ImageIcon( "bknight.jpg");
  284.    }
  285.    public void initboard ( int [] newxrecord ,int [] newyrecord ){
  286.       start = true ;
  287.       displayCount = -1 ;
  288.       for (int row = 0 ; row < 8 ;row ++){
  289.          for ( int column = 0 ; column < 8 ; column ++ ){
  290.             // white use 0 ,black use 1
  291.             chessboard [ row ][ column ] = ( row + column ) % 2 ;
  292.          }
  293.       }//end of outer for
  294.       for ( int row = 0 ; row < newxrecord .length ; row ++ ) {
  295.          xrecord [ row ] = newxrecord [ row ] ;
  296.          yrecord [ row ] = newyrecord [ row ] ;
  297.       }
  298.       displayCount = 0 ;
  299.       chessboard [ xrecord [ displayCount ] ][ yrecord [ displayCount ] ] += 2 ;
  300.    }//end of initboard
  301.    public void showNext() {
  302.       if ( displayCount < xrecord.length - 1 ){
  303.          displayCount ++ ;
  304.          chessboard [ xrecord [ displayCount ] ][ yrecord [ displayCount ] ] += 2 ;
  305.          repaint();
  306.       }
  307.    }
  308.    public void paintComponent ( Graphics g ) {
  309.       for (int row = 0 ; row < 8 ;row ++){
  310.          for ( int column = 0 ; column < 8 ; column ++ ){
  311.             images[ chessboard[ row ][ column ] ].paintIcon( this , g, 40 * row,40 * column );
  312.          }//end of inner for
  313.       }//end of outer for
  314.       if ( displayCount > 0 ){
  315.          lastxpos = xrecord [ displayCount  - 1];
  316.          lastypos = yrecord [ displayCount  - 1];
  317.          nextxpos = xrecord [ displayCount ];
  318.          nextypos = yrecord [ displayCount ];
  319.          g.setColor( Color.green);
  320.          g.drawRect( 40 * xrecord [ displayCount - 1 ] + 2,40 * yrecord [ displayCount - 1 ] + 2, 36, 36 );
  321.          g.setColor( Color.green);
  322.          g.drawRect( 40 * xrecord [ displayCount ] + 2 ,40 * yrecord [ displayCount ] + 2, 36, 36 );
  323.          g.setColor( Color.blue);
  324.          g.drawRect( 40 * Math.min( nextxpos, lastxpos ),
  325.             40 * Math.min( nextypos, lastypos ),
  326.             ( Math.abs( nextxpos - lastxpos ) + 1 ) * 40,
  327.             ( Math.abs( nextypos - lastypos ) + 1 ) * 40 );
  328.       }//end of if
  329.       g.setColor( Color.red );
  330.       g.drawRect ( 40 * xrecord [ 0 ] + 2,40 * yrecord [ 0 ] + 2, 36, 36 ) ;
  331.    }// end of the method paintComponent
  332. }