各位高手,能否为我提供一个利用回溯策略解决八皇后问题的源代码,小弟万分感谢!!!
最好是《data structures and the java collections framework》书中第四章的编程项目的原解!
最好是《data structures and the java collections framework》书中第四章的编程项目的原解!
解决方案 »
- Java 抓包问题
- 关于SWING程序客户端与服务端传送文件的问题
- SWT记事本中如何实现删除功能?
- 绝世美女,又问我恶梦般的问题,JAVA高手救我啊.系列(四)
- 有关数据库的问题
- 在sun的网站下了个swing包,如何使用?
- 高手请进,有关MVC(模型-视图-控制器)设计的讨论
- 菜鸟高分求经验!
- 再议,程序员=‘编码机器’?
- 求助java数组删除重复数字
- maven 简单问题:使用MAVEN 编译 sakai 时,提示 error reading xml or initializaing, 请问是不是缺少了什么, 我时初学JAVA,麻烦各位
- 找不到javax.servlet.*包和javax.servlet.http.*包
public class Queen {
static boolean[][] hh = new boolean[8][8];// 8*8棋盘
static int count = 0;// 已经放上的皇后数
static int num = 0;// 摆放方式的总数 public boolean tj1(int line) {// 条件一,判断此列是否有摆放皇后
for (int i = 0; i < 8; i++) {
if (hh[i][line] == true) {
return false;
}
}
return true;
} public boolean tj2(int k, int m) {// 条件二,判断对角线是否有摆放皇后
int i, j;
for (i = k, j = m; i < 8 && j < 8; i++, j++) {
if (hh[i][j] == true) {
return false;
}
}
for (i = k, j = m; i >= 0 && j >= 0; i--, j--) {
if (hh[i][j] == true) {
return false;
}
}
for (i = k, j = m; i >= 0 && j < 8; i--, j++) {
if (hh[i][j] == true) {
return false;
}
}
for (i = k, j = m; i < 8 && j >= 0; i++, j--) {
if (hh[i][j] == true) {
return false;
}
}
return true;
} // 主要的递归实现方法
public void mk(int line) {
if (line == 8)
return;// 超过8行则退出
for (int i = 0; i < 8; i++) {
if (tj1(i) && tj2(line, i)) {
hh[line][i] = true;
count++;
if (count == 8) {
System.out.println("\r\n");
pr();// 摆放皇后8个则打印结果
hh[line][i] = false;// 再次寻找其他情况
count--;
continue;
}
mk(line + 1);// 递归
hh[line][i] = false;
count--;
}
}
return;
} public void pr() {// 打印满足条件的摆放方法
num++;
System.out.println("<<<<<<<<<<" + num + ">>>>>>>>>>>>>>>");
for (int i = 0; i < 8; i++) {
System.out.println();
for (int j = 0; j < 8; j++) {
if (hh[i][j] == true) {
System.out.print("X ");
} else {
System.out.print("0 ");
}
}
}
} public static void main(String[] args) {
new Queen().mk(0);
System.out.println("\r\n\r\nnum = " + num);
}}来源:http://kuangbaoxu.iteye.com/blog/193291