這是個比較經典的問題了,以前看見都沒怎麼動手寫,今天看見了,決定寫一些。
思路:我們dfs每一行上的每個數,滿足條件就加入陣列繼續搜,搜完一遍重置資料,這就是回溯的思想,不影響下一次搜尋。
我一開始被卡在了對角線有沒有被搜尋過的判斷上了。後面發現。
從左下角到右上角的每一條對角線都可以用vis[i+j]來表示。
而從左上角到右下角的每一條對角線都可以用vis[i-j]來表示,因為i-j可能會小於n,所以我們表示為vis[i-j+n]。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n =
200;
#define inf int_max
#define inm int_min
int n,vis1[n]
,vis2[n]
,vis3[n]
,num =
3,ans[n]
,anss=0;
//vis1表示左上到右下的對角線(i+j),vis2表示左下到右上的對角線,ans為輸出陣列
void
print()
printf
("\n");
}}void
dfs(
int x)
for(
int j=
1;j<=n;
++j)}}
intmain()
八皇后(dfs 回溯)
重看了一下劉汝佳的白板書,上次寫八皇后時並不是很懂,再寫一次 方法1 逐行放置皇后,然後遞迴 1 include 2 define maxn 8 3 define ll long long 4using namespace std 56 ll ans 0 7 intc maxn 89 void df...
回溯 八皇后問題
八皇后問題 國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 八皇后問題是回溯演算法的典型案例。我想我們在自己做的過程中,是這樣的 是先從 0,0 這個座標開始排放皇后,然後 1...
八皇后問題 回溯
在劉汝佳老師的書中對於8皇后問題的分析 我感覺非常經典 8皇后問題可行的解 92個 一共有3種思考的出發點 從64個格仔中選乙個子集,使得 子集中恰好有8個格仔,且任意兩個選出的格仔都不在同一行,同一列或同一對角線上 這正是子集的列舉問題。然而,64個格仔的子集有264個,太大了,這並不是乙個很好的...