n皇后問題(回溯法 二進位制優化)

2021-10-10 14:49:29 字數 1492 閱讀 3765

在乙個n×n的西洋棋棋盤上放置n個皇后,使得她們中任意兩個之間都不會互相「攻擊」,即任意兩個皇后不可以放在同一行、同一列、同一斜線上。

輸入:n

輸出:有多少種滿足條件的放置方法。

利用約束條件,一維陣列即可。

x[i] 表示第i行的皇后的列數為x[i]。

對角線有兩種,向左斜和向右斜,都是45°,那麼怎麼得出這個約束條件的呢?

利用斜率是±1得出的,知道兩個點的橫縱座標,自然可以得出他們的斜率,(x[i]-x[j])/(i-j)=±1,加個絕對值符號,|x[i]-x[j]|/|i-j|=1,即abs(x[i]-x[j])=abs(i-j);

填到第k行,就要與前1~(k-1)行進行比較,看是否滿足條件。

int

judge

(int k)

return1;

}

#include

using namespace std;

int n,sum;

// n表示n*n的棋盤,sum表示結果

int x[15]

;// 陣列存位置

bool judge

(int t)

return1;

}void

dfs(

int t)

else}}

intmain()

return0;

}

核心**如下:

int n,sum,upperlim;

// upperlim 表示初始化為 (1 << n)-1

int x[15]

;void

dfs(

int row ,

int ld ,

int rd)

}else

}

初始化:upperlim = (1<(ld | p)<< 1 是因為由ld造成的佔位在下一行要右移一下;

(rd| p)>> 1 是因為由rd造成的佔位在下一行要左移一下。

ld rd row 還要和upperlime 與運算一下,這樣做的結果就是從最低位數起取n個數為有效位置,原因是在上一次的運算中ld發生了右移,如果不and的話,就會誤把n以外的位置當做有效位。

在進行到某一層的搜尋時,pos中儲存了所有的可放位置,為了求出所有解,必須遍歷所有可放的位置,而每走過乙個點必須要刪掉它,否則就成死迴圈了。

#include

using namespace std;

int n,sum,upperlim;

int x[15]

;void

dfs(

int row ,

int ld ,

int rd)

}else

}int

main()

return0;

}

二進位制問題

題目 題解 純二進位制題目。因為所有的水都是由兩份相同的水合併而成的,因此每瓶水的體積一定是2 i,i in n 2 i i n 公升。最後保留k個瓶子,那麼最後總的公升數的二進位制表示中,1的個數一定 k。本題實質上是用不超過k個1和無數個0生成乙個最接近且大於n的二進位制數 方法一 includ...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...