1. 程式人生 > >Java實現八皇后問題,用陣列遞迴演算法,簡單易懂

Java實現八皇后問題,用陣列遞迴演算法,簡單易懂

八皇后問題

要將八個皇后放在棋盤上,任何兩個皇后都不能互相攻擊。即沒有兩個皇后是在同一行、同一列或者同一對角上。

典型的八皇后問題,使用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){}出現判斷錯誤。