dfs 解決皇后問題

2021-08-17 19:53:39 字數 1316 閱讀 6350

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當 n2 = 1 或 n1 ≥ 4 時問題有解。

八皇后問題最早是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出。之後陸續有數學家對其進行研究,其中包括高斯和康托,並且將其推廣為更一般的n皇后擺放問題。八皇后問題的第乙個解是在2023年由弗朗茲·諾克給出的。諾克也是首先將問題推廣到更一般的n皇后擺放問題的人之一。2023年,s.岡德爾提出了乙個通過行列式來求解的方法,這個方法後來又被j.w.l.格萊舍加以改進。

艾茲格·迪傑斯特拉在2023年用這個問題為例來說明他所謂結構性程式設計的能力。

八皇后問題出現在2023年代初期的著名電子遊戲第七訪客中。

分析:其實也是一種貪心演算法,從第一行的第一列開始,找滿足條件的組合,比如:先把第一行第一列的儲存到陣列,然後在第二行找滿足條件的皇后,找到去第三行,沒有找到,回到第一行,找第二列,重複,有就繼續找,沒有就回到後面一點。

dfs最重要的就是回退和前進,回退是指走通了或者走到低換個方向。前進是按照方向前進,可以選擇。

**:#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

vectorv;

int sum=0;

int ok(int i,int j)//判斷選取的點是否滿足要求

}return 1;

}void print(int n)//輸出找到的皇后解決方案

for(int i=0;i

for(int i=0;i

cout<}

coutv.push_back(0);//開始探索

while(1)

}  //print();

if(v.size()==0)//當陣列個數為0時,則結束了探索

if(v.size()==n)//等於n時則說明找到了 ,輸出,換個方向前進

if(j==n)//代表這一行沒有滿足的,換方向,就是回退

if(j>n||v.size()>n)//代表要回退二步,

//print();}}

int main()  

hdu n皇后問題 (dfs)

小記 c語言經典問題,細細想來還是 蠻耐人尋味的。思路 對列深搜,就可以看每一列到底在哪一行 放皇后,然後斜列上的點的座標滿足 乙個等式,用三個陣列即可標記。詳情可看 的陣列解釋。include include include include using namespace std const in...

八皇后問題 DFS

古老而且典型的回溯問題 八皇后問題 找了採用深度優先 進行實現 思路 一 首先 需要 乙個判斷該位置能不能放的問題 1 乙個同一行 肯定不能放 並且 mat i col 問題了 2 左斜向上的部分肯定不能放 因為這裡是從0 行開始的 先卡第一行 在看第二行 要是左斜向上 有皇后 那麼這個位置不能放 ...

N皇后問題 DFS

在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...