在乙個8*8的棋盤上 放置八個皇后 , 使得他們互相不攻擊(皇后攻擊範圍為 同行同列同對角線) ,
從64個格仔中 選乙個子集 , 使得 " 子集 中恰好有八個元素 , 且任意選出的兩個格仔都不是同一行,同一列同,一對角線" , 這是子集列舉問題 , 然而 , 64個格仔的自己有2^64個 , 所需處理資料過大 !
從64個格仔中 選八個格仔 , 稱為組合生成問題 , 根據組合數學 有 4.426*10^9中方案 , 雖然比第一種好 , 但是然並卵 .
---------------------------我是分割線--------------------------------------
經過思考你會不難發現下面一種方法 , 每一行每一列恰好會放乙個皇后 , 所以可以從第一行開始放 , 然後考慮第二行 , 依次進行 下去 !
這樣就變成了全排列生成問題 , 這樣的排列有 8! = 40320個 , 列舉量不會超過該數字
然而 如果每次都列舉這麼多次的話 也會超時的 , 所以我們可以採用回溯的方法 或者 用 上/下乙個排列 .
1//這是一種很常用的方法 ,平時的搜尋 都是這 一種形式
2 #include3 #include
4 #include5 #include6 #include7 #include8 #include9 #include10 #include
11 #include12
using
namespace
std;
13int tot,c[1000],vis[3][1000],n,a[11
];14
void search(int
cur)
1528}29
}30intmain()
3140
while(scanf("
%d",&n),n)
4144
return0;
45 }
下面附上另乙個用時最短0ms 並且 容易理解的
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include
10 #include11
using
namespace
std;
12int n,c[10],tot,a[11
];13
void search(int
cur)
1429}30
if(ok)
31 search(cur+1
);32}33
}34intmain()
3543
while(scanf("
%d",&n),n) //
幾皇后 ?
4447 }
八皇后問題 紫書(劉汝佳)
解題思路 任意兩個皇后不能出現在同行同列及同對角線,可以直接考慮每一行放乙個皇后,依次往下進行。11 第1行的皇后放在0,1列都會和第0行的皇后攻擊,所以直接到了第2列,當第0和1行這麼放置皇后時,我們發現下一行無論放在哪一列皇后都會相互攻擊,所以此路不通,第1行的i要移動到下乙個列。11 現在我們...
八皇后問題詳解
目錄 要在8 8的西洋棋棋盤中放8個皇后,使任意兩個皇后都不能互相吃掉。規則是皇后能吃掉同一行 同一列 同一對角線的棋子。如下圖即是兩種方案 問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種方法...
八皇后問題
八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...