DFS解八皇后問題
阿新 • • 發佈:2019-02-09
仔細思考深度優先搜尋其實可以分為大概四步.
1.發現,找到想要找的節點,如八皇后就是找到當前行放置皇后的那個點,馬走日就是下一步的落點.
2.遞進,如果不滿足結束條件就繼續遞迴,進入下一層.如八皇后問題就是進入下一行.
3.滿足,條件滿足了之後,就輸出結果,一般都是用一個全域性變數來控制數量,一旦==N,就輸出結果.
4.返回,dfs得回溯才能遍歷所有的結果.
問題描述
八皇后問題是一個以國際象棋為背景的問題:如何能夠在8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?
也就是說,使得棋盤中每個橫向、縱向、左上至右下斜向、右上至左下斜向均只有一枚皇后。
程式碼如下:
#include"stdio.h" #include"math.h" const int N = 8; int a[N] = {0}; int solution = 0; bool isok(int row,int col)//判斷這個位置是否可以放置皇后 { for (int i = 0; i < row; i++) { //a[i]的值代表著列,i代表著行,所以重0開始遍歷驗證行和列有沒有重複的 if(a[i] == col || abs(a[i] - col) == row - i) { return false; } } } void Display()//如果陣列中個數到達了N個則輸出,相當於dfs的結束條件 { printf("第%d種解: \n",++soulution); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (a[i] == j) { printf("%d",i); } else { printf("#"); } } printf("\n"); } printf("---------------------\n"); } /* 從0,0這個位置開始迴圈,因為註定每一行都會有一個皇后,所以在第0行就有8种放法,之後依次下移. 相當於遞迴,結束條件就是row=N-1,也就是每一行都放了一個皇后,相當於一種解法. */ void DFS(int row) { for(int col = 0;col < N;col++) { if (isok(row,col)) { a[row] = col; if (row != N-1) { DFS(row + 1); } else { Display(); } } } } int main() { DFS(0); return 0; }