回溯法不用多说,深度优先递归搜索解空间树。N皇后的问题也不用多说,
直接粘代码。
package 回溯;
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;
/**
* 回溯法求解N皇后问题,利用Ansi包,输出彩色期盼
* @author 恝辉
*
*/
public class Nhou {
int n;// 皇后个数
int x[];// 当前位置
int bestx[];//最终的位置
int no;
public Nhou(int n) {
this.n = n;
x = new int[n + 1];
for (int i = 0; i <= n; i++) {
x[i] = 0;
}
no=0;
bestx = new int[n + 1];
}
/**
* 回溯法求解
* @param t
*/
void backtrack(int t) {
if (t == n + 1) {
System.out.println(n + "皇后摆列方式如下:");
for(int l =0;l<=n;l++) {
System.out.print(l + " | ");
}
System.out.println("");
System.out.println("————————————————————————————————————");
for (int i = 1; i <= n; i++) {
System.out.print(ansi().eraseScreen().fg(GREEN).a(i).fg(GREEN).a(" | "));
for (int j = 1; j <= n; j++) {
if (j == x[i]) {
System.out.print(ansi().eraseScreen().fg(RED).a("#").fg(GREEN).a(" | ") );
}
else{
System.out.print(0 + " | ");
}
}
System.out.println("");
System.out.println("————————————————————————————————————");
}
no++;
//System.out.println("-----------------------------------------------");
} else {
for (int k = 1; k <= n; k++) {
if (check(t, k)) {// 当前位置可以放.
x[t] = k;// 该层的第k个位置可以放
backtrack(t + 1);
}
}
}
}
/**
* 保证该位置可以放一枚棋子
* @param tt
* @param kk
* @return
*/
boolean check(int tt, int kk) {
for (int i = 1; i < tt; i++) {
if (kk == x[i] || Math.abs(tt - i) == Math.abs(kk - x[i])) {
return false;
}
}
return true;
}
}
(第一次写,如果发现问题请指正。)