一道八皇后問題相關問題
題目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 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...