藍橋杯訓練:八皇后問題
阿新 • • 發佈:2018-12-30
八皇后問題:在8×8格的國際象棋上擺放八個皇后,
使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,
問有多少種擺法。
思路,八皇后是典型的回溯演算法,方法如下,dfs演算法搜全排列,已行為推進,每選新一行跳轉布林判斷。新行的選取不能和前面已經放好的元素同列或者對角線,c==j || r-i=Math.abs(c-j) //絕對值的部分是斜率 k=(x1-x2)/(y1-y2) =±1 這種情況既在同一對角線上。
不滿足false置空,maze[][]=false回溯。繼續探尋。若滿足,直接在遞迴退出條件step=8里加上count++,統計滿足次數。
package 藍橋杯; public class eightqueen { static private final int col_row_num=8; static private int count=0; static private boolean maze[][]=new boolean[col_row_num][col_row_num]; public static void main(String[] args) { // TODO Auto-generated method stub dfs(0); System.out.println(count); } static boolean whetherConflict(int r,int c) { for(int i=0;i<r;i++) { for(int j=0;j<col_row_num;j++) { if(maze[i][j]) { if(c==j||r-i==Math.abs(c-j)) { return false; } } } } return true; } static void dfs(int step) { if(step==col_row_num) { count++; return; } for(int c=0;c<col_row_num;c++) { if(!maze[step][c]) { if(whetherConflict(step,c)) { maze[step][c]=true; dfs(step+1); maze[step][c]=false; } } } } }
參考於https://blog.csdn.net/liujian20150808/article/details/54691529