A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

问题说明:
骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。


算法代码
1.      public class Knight {
2.          public boolean travel(int startX,
3.                               int startY, int[][] board) {
4.              // 对应骑士可以走的八个方向
5.              int[] ktmove1 = {-2, -1, 1, 2, 2, 1,-1, -2};
6.              int[] ktmove2 = {1, 2, 2, 1, -1, -2,-2, -1};
7.              
8.              // 下一个出路的位置        int[] nexti = new int[board.length];
9.              int[] nextj = new int[board.length];
10.         
11.          // 记录出路的个数
12.          int[] exists = newint[board.length];
13.         
14.          int x = startX;
15.          int y = startY;
16.         
17.          board[x][y] = 1;
18.         
19.          for(int m = 2; m <=Math.pow(board.length, 2); m++) {
20.              for(int k = 0; k <board.length; k++) {
21.                 exists[k] = 0;
22.              }
23.              
24.              int count = 0;
25.              // 试探八个方向
26.              for(int k = 0; k <board.length; k++) {
27.                  int tmpi= x + ktmove1[k];
28.                  int tmpj= y + ktmove2[k];
29.                  
30.                  // 如果是边界,不可以走
31.                  if(tmpi< 0 || tmpj < 0 ||
32.                    tmpi > 7 || tmpj > 7) {
33.                     continue;
34.                  }
35.                  
36.                  // 如果这个方向可以走,记录下来
37.                 if(board[tmpi][tmpj] == 0) {
38.                     nexti[count] = tmpi;
39.                     nextj[count] = tmpj;
40.                     // 可走的方向加一个
41.                     count++;
42.                  }
43.              }
44.              
45.              int min = -1;
46.              if(count == 0) {
47.                  returnfalse;
48.              }
49.              else if(count == 1) {
50.                  min = 0;
51.              }
52.              else {
53.                  // 找出下个位置的出路数
54.                  for(intl = 0; l < count; l++) {
55.                     for(int k = 0; k < board.length; k++) {
56.                         int tmpi = nexti[l] + ktmove1[k];
57.                         int tmpj = nextj[l] + ktmove2[k];
58.   
59.                         if(tmpi < 0 || tmpj < 0 ||
60.                            tmpi > 7 || tmpj > 7) {
61.                             continue;
62.                         }
63.   
64.                         if(board[tmpi][tmpj] == 0)
65.                             exists[l]++;
66.                     }
67.                  }
68.   
69.                  int tmp= exists[0];
70.                  min = 0;
71.   
72.                  // 从可走的方向寻找最少出路的方向
73.                  for(intl = 1; l < count; l++) {
74.                     if(exists[l] < tmp) {
75.                         tmp = exists[l];
76.                         min = l;
77.                     }
78.                  }
79.              }
80.              
81.              // 走最少出路的方向
82.              x = nexti[min];
83.              y = nextj[min];
84.              board[x][y] = m;
85.          }
86.         
87.          return true;
88.      }
89.      
90.      public static void main(String[] args) {
91.          int[][] board = new int[8][8];
92.          Knight knight = new Knight();
93.         
94.          if(knight.travel(
95.                 Integer.parseInt(args[0]),
96.                 Integer.parseInt(args[1]), board)) {
97.             System.out.println("走棋完成!");
98.          }
99.          else {
100.              System.out.println("走棋失败!");
101.           }
102.           
103.           for(int i = 0; i < board.length;i++) {
104.               for(int j = 0; j <board[0].length; j++) {
105.                  if(board[j] < 10) {
106.                      System.out.print(" " + board[j]);
107.                   }
108.                   else {
109.                      System.out.print(board[j]);
110.                   }
111.                  System.out.print(" ");
112.               }
113.               System.out.println();
114.           }
115.       }
116.   }

6 个回复

正序浏览
多谢分享学习了
回复 使用道具 举报
那过往de小时光 来自手机 中级黑马 2015-9-17 08:26:54
报纸
我还是有点晕
回复 使用道具 举报
明天复习一下数组
回复 使用道具 举报
不知道以后会不会用到四维数组和八维数组之类的那就真的要死人了
回复 使用道具 举报
希望各位哥们不会被二维数组搞蒙
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马