Java實現八皇后問題,用陣列遞迴演算法,簡單易懂
阿新 • • 發佈:2019-02-20
八皇后問題
要將八個皇后放在棋盤上,任何兩個皇后都不能互相攻擊。即沒有兩個皇后是在同一行、同一列或者同一對角上。
典型的八皇后問題,使用Java寫的演算法,演算法雖比較簡單,但難免會有新手會犯疏漏和錯誤,希望大家可以批評指正,共同交流進步!
程式碼
@requires_authorization
public class Test {
public static void main(String[] args) {
Empress a=new Empress();
a.find(0);
System.out.println("八皇后問題共有:" +a.map+"種可能");
}
}
class Empress{
public int[][] arry=new int[8][8]; //棋盤,放皇后
public int map=0; //儲存方案結果
public boolean rule(int arry[][],int k,int j){ //判斷節點是否合適
for(int i=0;i<8;i++){ //行列衝突
if(arry[i][j]==1)
return false;
}
for (int i=k-1,m=j-1;i>=0&&m>=0;i--,m--){ //左對角線
if(arry[i][m]==1)
return false;
}
for(int i=k-1,m=j+1;i>=0&&m<=7;i--,m++){ //右對角線
if(arry[i][m]==1)
return false;
}
return true;
}
public void find(int i){ //尋找皇后節點
if(i>7){ //八皇后解
map++;
print();
return;
}
for(int m=0;m<8;m++){ //深度優先,遞迴演算法
if(rule(arry,i,m)){
arry[i][m]=1;
find(i+1);
arry[i][m]=0;
}
}
}
public void print(){ //列印方法結果
System.out.print("方案"+map+":");
for(int i=0;i<8;i++){
for(int m=0;m<8;m++){
if(arry[i][m]==1){
System.out.print("皇后"+(i+1)+"在第"+i+"行,第"+m+"列\t");
}
}
}
System.out.println();
}
}
注意
在這個演算法中,使用8X8陣列來表示棋盤,元素賦值1代表存在一個皇后,0表示無。主要是要注意回溯過程中已捨棄的皇后代表的陣列元素要置0,以免接下來繼續使用深度優先搜尋時,使用判斷規則public boolean rule(int arry[][],int k,int j){}
出現判斷錯誤。