刚在论坛里看到一个解骑士巡游的算法
(让一个马不重复的走遍棋盘每个格子)
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;
}
这个算法好像没什么问题,不过输出是打印出来的想求一个界面,像一个真的国际象棋棋盘一样
然后每一个格子写上第几步,不知道怎么做
最好能选择是从哪一个格子开始走
求高手指点,最好直接上代码
(让一个马不重复的走遍棋盘每个格子)
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;
}
这个算法好像没什么问题,不过输出是打印出来的想求一个界面,像一个真的国际象棋棋盘一样
然后每一个格子写上第几步,不知道怎么做
最好能选择是从哪一个格子开始走
求高手指点,最好直接上代码
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请按任意键继续. . .输出对么?
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);
}
}
}
}
}
}小改了一下给你
这个程序这样用,绿色的格子就是起始位置,
鼠标点击可以改变起始位置,
菜单中选择“显示结果”,就可以看到结果了