挑戰程式設計 演算法和資料結構 八皇后問題總結

2021-09-11 01:53:19 字數 1621 閱讀 7435

一道八皇后問題相關問題

題目19.1鏈結8 queens problem

這道題給出已有幾個皇后放置的位置,然後讓你補全剩下的位置。

自己的方法:

我的方法實際上就是維護乙個棋盤矩陣,值為0時可以放置,為-1時表示該位置是皇后,大於0時不可放置,每當放置乙個皇后時就要將皇后可以到達的地點+1,當去除乙個皇后時需要將皇后可以到達的地點-1。當然我使用了棧來記錄已放置的皇后的位置,當放置完最後一行時,跳出迴圈。

**如下:

#include #include #include #include using namespace std;

struct node

};const int max = 8;

int k, sr, sc;

int g[max][max];//0代表可以放置,-1代表是皇后,正數代表不能放

setr;

void load(node u)//放置u位置後,更新矩陣

for(int t=1; u.r+t=0; t++)//左下

for(int t=1; u.r-t>=0 && u.c+t=0 && u.c-t>=0; t++)//左上

for(int t=1; u.r+t=0; t++)//左下

for(int t=1; u.r-t>=0 && u.c+ts;//記錄已放置的位置

s.push(node(-1, -1));//初始放入乙個位置,利於以下迴圈

int v = -1;//上一次該行放置的皇后的列

while(1)

solve();

print();

return 0;

}

書上的方法:

變數設定如下:

變數含義

row[n]

如果row[x]為not_free,則x行受到攻擊

col[n]

如果col[x]為not_free,則x列受到攻擊

dpos[2*n-1]

如果dpos[n]為not_free,則斜向左下的x列受到攻擊

dneg[2*n-1]

如果dneg[n]為not_free,則斜向右下的x列受到攻擊

思路:只要row[i]、col[j]、dpos[i+j]、dneg[i-j+n-1](為了保證下標為非負,需要加上n-1)中任意乙個為not_free時,格仔(i,j)會受到攻擊。

技巧:主對角線座標相減,負對角線座標相加。

求出所有的八皇后的解,如果滿足輸入條件,則輸出結果,否則回溯繼續求解。

**如下:

#include #include using namespace std;

const int n = 8;

const int free = -1;

const int not_free = 1;

int row[n], col[n], dpos[2*n-1], dneg[2*n-1];

int g[n][n];

void printboard()

recursive(0);

return 0;

}

八皇后解法總結

四種解法:八皇后問題詳解(四種解法)

資料結構 八皇后演算法

八皇后的基本要求是這樣的 在乙個8 8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。參考網上資料改寫 如下 include include include includeusing namespace st...

挑戰程式設計 演算法和資料結構 搜尋(包括STL)

線性搜尋 o n 引入標記後效率提公升數倍 第二種 void linear int s,int t,int ns,int nt else if t i 雜湊法 o 1 重點是雜湊函式的構造,我 雜湊函式 h1 key return key m h2 key return 1 key m 1 h ke...

資料結構演算法 八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848 年提出 在 88 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 92 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...