傳送門:
參考部落格:
這題一開始用普通dfs,超時。
看大佬用位運算,我也來試試。不同的是,我用0表示不可放置,1表示可放置,那麼,在dfs的引數傳遞時有點麻煩
dfs函式中,p中的1,表示該行放置的位置,在進一步dfs時,考慮到對下一行的影響,~p才表示可放置的位置。
在同一列的角度,應當是當前列&~p:row&~p
在主對角線(left diagonal),應當是(當前狀態&~p)>>1,再高位補1,注意此時補的1應當為(1<>1)
在次對角線(right diagonal),應當是(當前狀態&~p)<<1,再低位補1,此時補的1是真的1。
不得不說,這麼做非常麻煩,還是可放置用0表示,不可放置用1表示方便寫程式。
我倔強地debug了2個多小時才把位運算這裡搞完。唉,太菜了。!!!
#include #include int n;
int ans;
int map[15];
int allone;
void dfs(int i,int row,int ld,int rd);
int main(void)
}
P1562 還是N皇后
p1562 還是n皇后 原來,就會位運算搞八皇后,當複習一下。可行的位置是1,其他是0 比如11011 到下一行的時候,對應的左斜線和右斜線要移一位 1 include2 include3 include4 include5 include6 include7 include8 define inf...
洛谷1219N皇后
題目描述 乙個如下的 6 66 times 66 6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列 2 4 6 1 3 52 4 6 1 3 52 4 6 1 3 5 來描述,第 iii 個數字表示...
位運算n皇后 洛谷1219
老鐵已經很久沒有更博了。自從考完noip後老鐵一蹶不振,從此走上心理陰影無限大,吾將上下而求索的道路。又去石家莊聽課 並不能聽懂 於是自己學一學一些奇怪的演算法。題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行...