算法系列之八皇后以及n皇后問題詳解

//八皇后問題
/*
在一個8*8的棋盤上放置8個皇后,不允許任何兩個皇后在棋盤的同一行、同一列和同一對角線上。
1)
對8 x 8的二維數組上的某點a[i]j
如果a[s][q]滿足|s-i|=|q-j|,a[s][q]在a[i][j]的對角線上。
如果s=i,則a[s][q]在a[i][j]的同一列上。
2)
每行有且僅有一個皇后:聲明數組Queen[8] 存放皇后位置//Queen[n]數組的含義爲將第n個皇后放在格子的(n,Queen[n])位置
public static int judge(int n)//判斷(n,Queen[n])位置是否可以放皇后
3)
每一行只放一個皇后把每個點都試一遍使得試出最後的所有放皇后的位置
*/
public class EightQueen {
//定義皇后的個數
static int queennum = 8;
static int[] Queen = new int[queennum];
//最後滿足條件的次數
static int count = 0;
//寫一個回溯的分別進行每一行進行放置皇后使得進行下一行的放置
public static void NQueen(int n)//放置第n行皇后
{
//每一行的每一個位置進行測試放置皇后
for (int i = 0; i < queennum; i++) {
//皇后的位置進行賦值
Queen[n]=i;
//判斷是否能放置皇后
if(judge(n)){
//如果是最後的一行並且滿足條件的話則進行總次數的++操作
if(n==queennum-1){
Show();
System.out.println();
count++;//方法加一
}else {
//否則的話則進行下一行的皇后進行放置
NQueen(n+1);
}

        }
    }

}
//寫一個判斷是否可放置的函數
public static boolean judge(int n)//判斷(n,Queen(n))能否放置皇后* n爲第幾行
{
    //循環要進行完因爲要進行所有上滿的列和所有上面的的對角線進行對比
    for (int j = 0; j <n ; j++) {
        //首先判斷同列,再判斷對角線 ,同行不用判斷因爲是逐行放的沒行只放一個
        if(Queen[j]==Queen[n]||Math.abs(Queen[j]-Queen[n])==n-j){
            return false;
        }
    }
    return true;

}
public static void Show()
{
    for(int i=0;i<queennum;i++)
    {
        System.out.print("("+i+","+Queen[i]+")");
    }
}
public static void main(String[] args){
    NQueen(0);            //初始放置第一行的皇后
    System.out.print("共有"+count+"種方式");
}

}

測試結果:(共8種)
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,1)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,2)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,3)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,4)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,5)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,6)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

(0,7)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)

共有8種方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章