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