public class Queen {
private int position;
public Queen(){
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
}
棋盤類,設置0可以擺放皇后,1不可。下面程序里,設置無效位置即為將數組相應位置+1;
public class Bord {
private int size;
private int[][] a;
public Bord(int bsize){
this.size=bsize;
a=new int[size][size];//初始化每個都為0,都可以擺放
for(int i=0;i<size;i++)
for(int j=0;j<size;j++)
a[i][j]=0;
}
主程序
public class QueenSolve {
int queensize; //皇后的數量
ArrayList<Queen> queens; //皇后數組,數組中的索引值表示是第幾行的皇后
Bord bord; //新建個棋盤
int numSolutions; //總共解法的次數
public QueenSolve(int size) { //解法初始化的類
queensize=size;
queens=new ArrayList<>();
for(int i=0;i<queensize;i++) //新建皇后,并放進去
queens.add(new Queen());
bord=new Bord(queensize); //棋盤
numSolutions=0; //初始化次數
}
/*主類*/
public static void main(String[] args) {
// TODO Auto-generated method stub
QueenSolve queenSolve=new QueenSolve(8); //初始化,然后調用解法
queenSolve.solve();
}
public void solve(){
System.out.println("Start solve...."); //解題在下面方法完成,所以只會輸出一次
putQueen(0); //開始,調用
}
private void putQueen(int index){
int row=index;
for(int col=0;col<queensize;col++){ //從當前行的第一個位置開始
/*如果位置為0,則有效,把該行的皇后放進去*/
if(bord.getA()[row][col]==0){
queens.get(row).setPosition(col); //設置該行皇后位置
/*下面是把本次循環無效位置設置為0,因為不會再在上面擺了,所以只要把下面的設置為1就行了
這不影響我們打印因為,每個皇后的位置已經保存過了*/
for (int i = row + 1; i < bord.getSize(); i++) {
bord.getA()[i][col] ++; //皇后位置所在的那一列,一個循環往下設置一個,直到結束全部設置完成
if (row + col - i >= 0) { //如果往左的對角線元素存在,把他設置為1
bord.getA()[i][row + col - i] ++;
}
if (i + col - row < bord.getSize()) {//如果往右的對角線元素存在,把他設置為1
bord.getA()[i][i + col - row] ++;
}
}
if (row == bord.getSize()-1) { //如果已經是最后一行了,就說明解題結束,次數加1在打印
numSolutions++;
printSolution(numSolutions);
}else {
putQueen(row+1);//執行到這里,就是這一行已經擺好位置了,換下一行去處理
}
//上面一句執行,如果下一行每一行都為1,說明這一行走錯了,把這一行的操作退回去,這個col是錯誤的,
//執行完退回操作,回到上面繼續下一個col
for (int i = row + 1; i < bord.getSize(); i++) {
bord.getA()[i][col] --;
if (row + col - i >= 0) {
bord.getA()[i][row + col - i] --;
}
if (i + col - row < bord.getSize()) {
bord.getA()[i][i + col - row] --;
}
}
}
}
}
private void printSolution(int i){
System.out.println("The "+i+ " solution is:");
for (int j = 0; j < bord.getSize(); j++) {
for (int k = 0; k < bord.getSize(); k++) {
//是那個位置的話輸出*,不是輸出-
System.out.print(queens.get(j).getPosition() == k ? " * ":" - ");
}
System.out.println();
}
System.out.println();
}
}