遞迴 回溯法解決八皇后問題 java實現

2021-08-15 19:29:41 字數 1307 閱讀 1728

八皇后問題:在乙個8*8的棋盤上,放置八個皇后,使得八個皇后之間不能互相攻擊,(皇后不能互相攻擊的條件是兩個皇后之間寂不在同一列或者同一行也不在同一條正斜線或者反斜線上)

演算法:我用了回溯+遞迴解決了這題,首先定義乙個二維陣列儲存棋盤,都初始化為0,定義0表示可以放置皇后,然後寫乙個遞迴函式,函式的功能是不停的嘗試下一行,嘗試某一行的時候,假如這一行有位置可以放置的話,就吧這個位置的值設定為9,因為1到8要用來標記這個放置的位置在整個棋盤上可以攻擊到的位置,把哪些位置的值設定為這一行的序數,但是由於我在標記的時候有的位置已經被標記過了,那麼那個位置就不用標記了,用行數來作為標記的好處是,我在回溯的時候方便知道我上一行做的更改,就這樣一直列舉到最後第8行,如果第八行有可行解就輸出乙個方案,同時result+1,回溯到第一行,第一行列舉完成之後程式結束,那麼問題來了,怎麼定義這個函式呢?函式如下:

public static void trynext(int n)else

huisu(n,i);

}} }

實際上這是乙個類似於模板的函式,對於大部分回溯都可以嘗試用這個模板來解決,全部**如下:

public class eightqueen 

} trynext(0);

system.out.println("總共的方案數目是"+result); }

public static void trynext(int n)else

huisu(n,i);

}} }

public static void sign(int x,int y)

} for(int i=0;i<8;i++)

}while(x>0&&y>0)

} x=tempx;

y=tempy;

while(x<7&&y<7)

} x=tempx;

y=tempy;

while(x>0&&y<7)

} x=tempx;

y=tempy;

while(x<7&&y>0)

} datas[tempx][tempy]=9;

} public static void huisu(int x,int y)}}

}public static void printitem()

system.out.println();}}

}

結果如下:

八皇后問題 遞迴 回溯法

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...

八皇后問題 遞迴 回溯法

八皇后問題,是乙個古老而著名的問題。是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊。即隨意兩個皇后都不能處於同一行 同一列或同一斜線上。問有多少種擺法。高斯覺得有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...

八皇后問題 遞迴回溯法

寫在前面 最開始接觸是資料結構老師在提到過,後來在學python時老師也有提到過,出於好奇就去思考了這個問題,當然,小白的我還是在b站懶貓老師的幫助下學會啦,真棒哈哈哈哈哈哈 這裡主要問題是在於判斷對角線上是否能放,表示上對角線d1,表示下對角線d2,根據老師所說加上自己的理解,同乙個下對角線上 n...