利用搜尋樹來解決N皇后問題

2021-08-25 20:46:23 字數 1692 閱讀 2699

資料結構裡面有個比較著名的八皇后問題,其解決方式倒有很多種,而搜尋樹又算是乙個人工智慧方面的入門的思想和手段了。下面就說下如何用搜尋樹來解決n皇后問題

以四皇后問題為例,如圖:

在第零層,只有乙個根節點

在第一層,有四個節點符合符合條件,故根節點有四個子節點

在第二層,各個子節點又具有不同的節點,所以,這棵樹繼續往下生長,直至長到第4層,也就是說找到了解,那麼第四層的節點就是這個四皇后問題的解了。(注意,這裡可以採用深度優先搜尋與廣度優先搜尋,各有利弊)

同樣的理論和方法,利用這個搜尋樹可以實現尋找出所有形式的皇后問題的解,下面就附上c++的源**

#include #include const int size = 8; //這個是皇后問題的個數

const char queue = '*'; //表示該點已經存在皇后了

const char valid = ' '; //表示該點還可以放置皇后

const char invalid = '_'; //表示該點因不符合條件而不能放置皇后

//定義搜尋樹的節點,這個節點包含節點的高度及盤面狀態(利用陣列來儲存)

typedef struct _queuenode

queuenode;

//根據給定的位置來更新相應節點中的盤面資訊

void updatemapbyposition(queuenode *node, int position)

}//更新豎行

for (int i = 0; i != size; i++)

}//更新斜行

for (int i = 0; i != size; i++)

if (((i - j) == (node->height - position)) && node->map[i][j] == valid)}}

}//這個用來搜尋子節點並更新queuelist

void collectnextnodes(std::list&queuelist, queuenode *node)

for (int i = 0; i != size; i++)

}tempnode->height = node->height;

tempnode->map[tempnode->height][i] = queue;

updatemapbyposition(tempnode, i);

tempnode->height++;

queuelist.push_back(tempnode);}}

}int main()

}node->height = 0;

queuelist.push_back(node);

while (!queuelist.empty())

else

}//這裡作為乙個資料鑑別,表明一共有多少個符合條件的答案

std::cout << solution.size()

}std::cout << std::endl;}}

}

賦予size不同的數值就可以得出不同的解,這裡我只是列印出了第乙個解,其餘的解都已經存在於solution中,可以自己去處理下

皇后問題的解依照其問題的大小而不同,而隨著資料的增大,其空間複雜度幾乎就是呈指數形式的增長,在我的電腦上跑下size=15的時候就掛了....

當然皇后問題也不止這一種解決方法,還有諸如貪心演算法等可以解決,也可以說是各取所需吧。

N皇后問題(搜尋)

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

DFS搜尋 N皇后問題

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

利用深度搜尋法解決八皇后問題

八皇后問題每行必須有乙個皇后,所以,對棋盤深蒐時,第乙個皇后的位置不妨設為第一行,這樣只對第一行進行搜尋,同理,第二個皇后不妨設為第二行,以此類推。下面附我的 includeusing namespace std struct node1 棋盤模擬,不可以放皇后的地方值為0,可以為1 struct ...