在乙個n×n的西洋棋棋盤上放置n個皇后,使得她們中任意兩個之間都不會互相「攻擊」,即任意兩個皇后不可以放在同一行、同一列、同一斜線上。
輸入:n
輸出:有多少種滿足條件的放置方法。
利用約束條件,一維陣列即可。
x[i] 表示第i行的皇后的列數為x[i]。
對角線有兩種,向左斜和向右斜,都是45°,那麼怎麼得出這個約束條件的呢?填到第k行,就要與前1~(k-1)行進行比較,看是否滿足條件。利用斜率是±1得出的,知道兩個點的橫縱座標,自然可以得出他們的斜率,(x[i]-x[j])/(i-j)=±1,加個絕對值符號,|x[i]-x[j]|/|i-j|=1,即abs(x[i]-x[j])=abs(i-j);
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 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...