package org.lfj.queen;
/**
* 八皇后的解法
*
*/
public class Queen {
/**
* 多少皇后
*/
private int queenSize;
/**
* 多少解法
*/
private int solutionSum = 0;
//存储第N行的皇后所在的第N列的位置
private int[] data;
public Queen(int queenSize) {
this.queenSize = queenSize;
//将a[0]不使用
this.data = new int[queenSize+1];
}
//回溯法计算N皇后
public void backTrack(int t){
//如果得到了结果就输出
if(t > queenSize){
solutionSum++;
for (int i = 1; i < data.length; i++) {
print(data[i]);
}
System.out.println("这是第"+solutionSum+"种解法!!");
}else{
for (int i = 1; i < queenSize+1; i++) {
data[t] = i;
if(matchRule(t)){
//通过递归调用查找下一个皇后位置
backTrack(t+1);
}
}
}
}
//判断是否符合N皇后规则
private boolean matchRule(int k){
for (int i = 1; i < k; i++) {
if(Math.abs(data[i]-data[k])==Math.abs(i-k) ||
data[i] == data[k]){
return false;
}
}
return true;
}
private void print(int c){
for (int i = 1; i < c; i++) {
System.out.print("* ");
}
System.out.print("q ");
for (int i = c; i < queenSize; i++) {
System.out.print("* ");
}
System.out.println("\n");
}
public static void main(String[] args) {
//print(1);
Queen queen = new Queen(20);
queen.backTrack(1);
}
}
/**
* 八皇后的解法
*
*/
public class Queen {
/**
* 多少皇后
*/
private int queenSize;
/**
* 多少解法
*/
private int solutionSum = 0;
//存储第N行的皇后所在的第N列的位置
private int[] data;
public Queen(int queenSize) {
this.queenSize = queenSize;
//将a[0]不使用
this.data = new int[queenSize+1];
}
//回溯法计算N皇后
public void backTrack(int t){
//如果得到了结果就输出
if(t > queenSize){
solutionSum++;
for (int i = 1; i < data.length; i++) {
print(data[i]);
}
System.out.println("这是第"+solutionSum+"种解法!!");
}else{
for (int i = 1; i < queenSize+1; i++) {
data[t] = i;
if(matchRule(t)){
//通过递归调用查找下一个皇后位置
backTrack(t+1);
}
}
}
}
//判断是否符合N皇后规则
private boolean matchRule(int k){
for (int i = 1; i < k; i++) {
if(Math.abs(data[i]-data[k])==Math.abs(i-k) ||
data[i] == data[k]){
return false;
}
}
return true;
}
private void print(int c){
for (int i = 1; i < c; i++) {
System.out.print("* ");
}
System.out.print("q ");
for (int i = c; i < queenSize; i++) {
System.out.print("* ");
}
System.out.println("\n");
}
public static void main(String[] args) {
//print(1);
Queen queen = new Queen(20);
queen.backTrack(1);
}
}