刚在论坛里看到一个解骑士巡游的算法
(让一个马不重复的走遍棋盘每个格子)
public class Horse1 {
private static final int[] dx = {-2,-2,-1,-1, 1, 1, 2, 2};
private static final int[] dy = {-1, 1,-2, 2,-2, 2,-1, 1};
private static final int R=8,C=8;
int[][] board = new int[R][C];
Vector<Info> dir = new Vector<Info>(8);

public Horse1() {
for (int i=0;i<8;i++) {
dir.add(new Info());
}
}

private int outlet(int x,int y) {
int ct=0;
for(int i=0;i<8;++i) {
if((x+dx[i])<0 || (y+dy[i])<0 || (x+dx[i])>=R || (y+dy[i])>=C || board[x+dx[i]][y+dy[i]]>0 ) {
continue;
} else {
++ct;
}
}
return ct;
}//计算(x,y)的出口数 private void sort(int n) {
for(int i=n-1;i>0;--i) {
if(dir.get(i).out < dir.get(i-1).out) {
Collections.swap(dir, i, i-1);
} else {
break;
}
}
}//按出口数由小到大排序 private boolean search(int x,int y,int step) {
if(step==R*C) {
board[x][y]=step;
return true;
} else {
board[x][y]=step;
int i,j;
for(i=j=0;i<8;++i) {
if((x+dx[i])<0 || (y+dy[i])<0 || (x+dx[i])>=R || (y+dy[i])>=C || board[x+dx[i]][y+dy[i]]>0 ) {
continue;
} else {
    dir.get(j).x = x+dx[i];
    dir.get(j).y = y+dy[i];
    dir.get(j).out = outlet(dir.get(j).x,dir.get(j).y);
    sort(++j);
}
}
for(i=0;i<j;++i) {
if(search(dir.get(i).x,dir.get(i).y,step+1)) return true;
}
board[x][y]=0;
return false;
}
}//求解 public void show() {
int i,j,m,n;
for(i=0;i<R;++i) {
for(j=0;j<C;++j) {
board = new int[R][C];
if(search(i,j,1)) {
System.out.printf("start at(%d,%d):\n",i+1,j+1);
for(m=0;m<R;++m) {
for(n=0;n<C;++n) {
System.out.printf("%4d",board[m][n]);
}
System.out.printf("\n\n");
                }
             } else {
              System.out.printf("start at(%d,%d) has no solve!\n",i+1,j+1);
             }
}
}
}

public static void main(String[] args) {
Horse1 horse = new Horse1();
horse.show();
}
}class Info {
int x;
int y;
int out;
}
这个算法好像没什么问题,不过输出是打印出来的想求一个界面,像一个真的国际象棋棋盘一样
然后每一个格子写上第几步,不知道怎么做
最好能选择是从哪一个格子开始走
求高手指点,最好直接上代码

解决方案 »

  1.   

      59  32  63  40  53  46  15  24  36   9  52  55  44  23  48  19  33  58  35  22  39  54   1   4   8  37  56  51   6   3  20  49  57  34   7  38  21  50   5   2start at(6,8):
      29   8  43  46  31  10  39  14  44  49  30   9  42  13  32  11   7  28  45  58  47  40  15  38  50  59  48  41  36  55  12  33  27   6  57  54  63  34  37  16  60  51  62  35  56  19  22   1   5  26  53  64   3  24  17  20  52  61   4  25  18  21   2  23start at(7,1):
      19  28  15  44  33  30  13  54  16  41  18  29  14  53  34  31  27  20  43  52  45  32  55  12  42  17  40  25  58  51  46  35  21  26  59  50  39  56  11  62   6   3  24  57  60  63  36  47   1  22   5   8  49  38  61  10   4   7   2  23  64   9  48  37start at(7,2):
       4  23  42  37   6  21  28  45  41  38   5  22  43  46   7  20  24   3  40  51  36  27  44  29  39  52  49  26  47  63  19   8   2  25  55  62  50  35  30  64  54  57  13  48  33  61   9  18  14   1  59  56  16  11  34  31  58  53  15  12  60  32  17  10start at(7,3):
      33  20  31   6  35  10  41   8  30   5  34  21  40   7  36  11  19  32  39  44  37  60   9  42   4  29  22  53  46  43  12  61  23  18  45  38  59  52  55  50  28   3  26  47  54  49  62  13  17  24   1  58  15  64  51  56   2  27  16  25  48  57  14  63start at(7,4):
      38  29   6  27  48  13   8  11   5  26  37  40   7  10  47  14  30  39  28  51  36  49  12   9  25   4  41  44  57  52  15  46  42  31  58  35  50  45  62  19   3  24  43  56  61  18  53  16  32  59  22   1  34  55  20  63  23   2  33  60  21  64  17  54start at(7,5):
      11   8  13  38  27   6  29  40  14  37  10   7  42  39  26   5   9  12  61  36  45  28  41  30  60  15  46  43  62  57   4  25  19  50  59  64  35  44  31  56  16  47  18  53  58  63  24   3  51  20  49  34   1  22  55  32  48  17  52  21  54  33   2  23start at(7,6):
       8  41  10  35   6  31  20  33  11  36   7  40  21  34   5  30  42   9  54  37  44  39  32  19  53  12  43  46  55  22  29   4  50  57  52  61  38  45  18  23  13  62  49  56  47  26   3  28  58  51  64  15  60   1  24  17  63  14  59  48  25  16  27   2start at(7,7):
      51  28  21   6  49  38  23   4  20   7  50  37  22   5  48  39  29  52  27  54  45  58   3  24   8  19  36  57  26  55  40  47  35  30  53  44  59  46  25   2  18   9  60  33  56  13  64  41  31  34  11  16  43  62   1  14  10  17  32  61  12  15  42  63start at(7,8):
      54  13  30  33  44  15  28  19  31  34  53  14  29  18  41  16  12  55  32  45  52  43  20  27  35  46  51  58  25  40  17  42  56  11  62  39  50  59  26  21  47  36  57  60  63  24   3   6  10  61  38  49   8   5  22   1  37  48   9  64  23   2   7   4start at(8,1):
      38  19  40   5  36   9  46   7  41   4  37  20  55   6  35  10  18  39  54  43  58  45   8  47   3  42  21  56  53  62  11  34  22  17  52  59  44  57  48  61  27   2  25  30  63  60  33  12  16  23  28  51  14  31  64  49   1  26  15  24  29  50  13  32start at(8,2):
      31  34   5  42  29  12   7  10   4  41  30  33   6   9  28  13  35  32  43  40  57  38  11   8  44   3  58  37  46  55  14  27  21  36  45  56  39  60  47  62   2  51  20  59  54  63  26  15  19  22  53  50  17  24  61  48  52   1  18  23  64  49  16  25start at(8,3):
      20   5  38  47  22   7  26  45  37  50  21   6  39  46  23   8   4  19  56  51  48  25  44  27  55  36  49  32  57  40   9  24  18   3  54  61  52  43  28  41  35  62  33  58  31  60  13  10   2  17  64  53  12  15  42  29  63  34   1  16  59  30  11  14start at(8,4):
       5  42  23  36   7  52  25  34  22  37   6  57  24  35   8  53  43   4  41  38  51  58  33  26  40  21  56  45  60  27  54   9   3  44  39  50  55  32  59  28  20  49  18  31  46  61  10  13  17   2  47  62  15  12  29  64  48  19  16   1  30  63  14  11start at(8,5):
      34  25  42   7  36  23  46   5  41   8  35  24  47   6  37  22  26  33  48  43  38  51   4  45   9  40  27  54  49  44  21  52  28  55  32  39  60  53  50   3  13  10  61  56  31  18  59  20  62  29  12  15  64  57   2  17  11  14  63  30   1  16  19  58start at(8,6):
      45  26   7  22  47  38   5  20   8  23  46  39   6  21  50  37  27  44  25  48  51  56  19   4  24   9  40  57  32  49  36  55  41  28  43  52  61  54   3  18  10  13  60  31  58  33  62  35  29  42  15  12  53  64  17   2  14  11  30  59  16   1  34  63start at(8,7):
      10   7  12  29  48   5  34  31  13  28   9   6  33  30  49   4   8  11  38  47  50  59  32  35  27  14  43  62  37  52   3  58  44  39  46  51  60  63  36  21  15  26  61  42  53  20  57   2  40  45  24  17  64  55  22  19  25  16  41  54  23  18   1  56start at(8,8):
       7  46   9  36   5  40  19  38  10  35   6  55  20  37   4  41  47   8  45  58  43  54  39  18  34  11  62  53  56  21  42   3  61  48  57  44  59  52  17  22  12  33  60  63  30  25   2  27  49  64  31  14  51  28  23  16  32  13  50  29  24  15  26   1请按任意键继续. . .输出对么?
      

  2.   

    呵呵,sunyiz 点儿正。lz做的有点不对,帖子没结,又拿着人家的代码重新发帖了。
      

  3.   

    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Collections;
    import java.util.Vector;import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;public class HorseFrame extends JFrame{
    private static final int[] dx = {-2,-2,-1,-1, 1, 1, 2, 2};
    private static final int[] dy = {-1, 1,-2, 2,-2, 2,-1, 1};
    private static final int R=8,C=8;
    int[][] board = new int[R][C];
    Vector<Info> dir = new Vector<Info>(8);
    private JMenuBar menuBar;
    private ShowPanel pnlMain;
    private Point start;

    public HorseFrame() {
    initialize();
    }

    private void initialize() {
    for (int i=0;i<8;i++) {
    dir.add(new Info());
    }
    start = new Point();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(270, 290);
    this.setLocationRelativeTo(null);
    this.setLocation(0,700);
    Container cont = this.getContentPane();
    pnlMain = new ShowPanel();
    cont.add(pnlMain);
    menuBar = new JMenuBar();
    this.setJMenuBar(menuBar);
    JMenu menu;
    JMenuItem item;
    menu = new JMenu("选项");
    item = new JMenuItem("显示结果");
    item.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    board = new int[R][C];
    search(start.x, start.y, 1);
    pnlMain.updateUI();
    }
    });
    menu.add(item);
    menuBar.add(menu);
    }

    private int outlet(int x,int y) {
    int ct=0;
    for(int i=0;i<8;++i) {
    if((x+dx[i])<0 || (y+dy[i])<0 || (x+dx[i])>=R || (y+dy[i])>=C || board[x+dx[i]][y+dy[i]]>0 ) {
    continue;
    } else {
    ++ct;
    }
    }
    return ct;
    }//计算(x,y)的出口数 private void sort(int n) {
    for(int i=n-1;i>0;--i) {
    if(dir.get(i).out < dir.get(i-1).out) {
    Collections.swap(dir, i, i-1);
    } else {
    break;
    }
    }
    }//按出口数由小到大排序 private boolean search(int x,int y,int step) {
    if(board[x][y] > 0) return false;
    if(step==R*C) {
    board[x][y]=step;
    return true;
    } else {
    board[x][y]=step;
    int i,j;
    for(i=j=0;i<8;++i) {
    if((x+dx[i])<0 || (y+dy[i])<0 || (x+dx[i])>=R || (y+dy[i])>=C || board[x+dx[i]][y+dy[i]]>0 ) {
    continue;
    } else {
        dir.get(j).x = x+dx[i];
        dir.get(j).y = y+dy[i];
        dir.get(j).out = outlet(dir.get(j).x,dir.get(j).y);
        sort(++j);
    }
    }
    for(i=0;i<j;++i) {
    if(search(dir.get(i).x,dir.get(i).y,step+1)) return true;
    }
    board[x][y]=0;
    return false;
    }
    }//求解 public static void main(String[] args) {
    HorseFrame frame = new HorseFrame();
    frame.setVisible(true);
    }

    class Info {
    int x;
    int y;
    int out;
    }

    class ShowPanel extends JPanel {

    public ShowPanel() {
    this.addMouseListener(new MouseAdapter(){
    @Override
    public void mousePressed(MouseEvent e) {
    int x = (e.getX()-30)/25;
    int y = (e.getY()-20)/25;
    int oldx = start.x;
    int oldy = start.y;
    if (x<0) {
    x=0;
    }
    if (x>7) {
    x=7;
    }
    if (y<0) {
    y=0;
    }
    if (y>7) {
    y=7;
    }
    start.move(x, y);
    repaint(oldx*25+31, oldy*25+21, 24, 24);
    repaint(start.x*25+31, start.y*25+21, 24, 24);
    }
    });
    }

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.GRAY);
    for (int i=0;i<9;i++) {
    g.drawLine(i*25+30, 20, i*25+30, 220);
    g.drawLine(30, i*25+20, 230, i*25+20);
    }
    for (int i=0;i<8;i++) {
    for (int j=0;j<8;j++) {
    if ((i+j)%2 == 0) {
    g.setColor(Color.WHITE);
    } else {
    g.setColor(Color.BLACK);
    }
    g.fillRect(j*25+31, i*25+21, 24, 24);
    }
    }
    g.setColor(Color.GREEN);
    g.fillRect(start.x*25+31, start.y*25+21, 24, 24);
    for (int i=0;i<8;i++) {
    for (int j=0;j<8;j++) {
    if ((i+j)%2 == 0) {
    g.setColor(Color.BLACK);
    } else {
    g.setColor(Color.WHITE);
    }
    if (board[j][i] != 0) {
    g.drawString(""+board[j][i], j*25+36, i*25+38);
    }
    }
    }
    }
    }
    }小改了一下给你
    这个程序这样用,绿色的格子就是起始位置,
    鼠标点击可以改变起始位置,
    菜单中选择“显示结果”,就可以看到结果了