前一日志用回溯法做了java四皇后的解。Java解决N皇后问题
因丢弃书本很久,各种算法和语法日渐生疏,写的也是百般不顺,提笔忘语法,下班后,思考了一阵,决定给自己一个学习和回忆的机会,不再局限于4皇后,写一个较为通用的N皇后解决办法。记之:
package cn.sentor.test;
/**
* 通用版本的N皇后问题。
* @author whuige@live.com
*
*
*
* Queen q = new Queen(8);
* q.compute();
*
*
*/
public class Queen {
private int n;
/**
* 数组锁定为列索引, 数组值为该列的行号。 都从0开始。
*/
private int[] cols;
public Queen(int n) {
this.n = n;
this.cols = new int[n];
}
public void compute() {
walk(0);
}
public void walk(int index) {
if (index >= n) {
System.out.printf("Got Answer, columns index is : \n");
for (int i : cols)
System.out.printf("%d, ", (i+1));
System.out.println("");
} else {
for (int i = 0; i < n; i++) {
cols[index] = i;
if (satisfied(index)) {
walk(index + 1);
}
}
}
}
/**
* 判断当前摆放是否满足N皇后定义条件。
* @param index :从第一列到第index列是否满足约束条件。
* @return
*/
public boolean satisfied(int index) {
for (int i=0;i
if (cols[i] == cols[index] || Math.abs(index-i) == Math.abs(cols[index]-cols[i])) {
return false;
}
}
return true;
}
public static void main(String args[]) {
Queen q = new Queen(8);
q.compute();
}
}