洛谷 p1219 八皇后

2022-06-03 10:42:10 字數 1731 閱讀 8601

剛參加完藍橋杯 弱雞錯了好幾道。。回頭一看確實不難 寫起來還是挺慢的

於是開始了刷題的道路

藍橋杯又名搜尋杯 暴力杯。。。於是先從dfs刷起

八皇后是很經典的dfs問題 洛谷的這道題是這樣的

上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下:

行號 1 2 3 4 5 6

列號 2 4 6 1 3 5

這只是跳棋放置的乙個解。請編乙個程式找出所有跳棋放置的解。並把它們以上面的序列方法輸出。解按字典順序排列。請輸出前3個解。最後一行是解的總個數。

輸入格式:

乙個數字n (6 <= n <= 13) 表示棋盤是n x n大小的。

輸出格式:

前三行為前三個解,每個解的兩個數字之間用乙個空格隔開。第四行只有乙個數字,表示解的總數。

輸入樣例#1:

6
輸出樣例#1:

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4弱雞艱難的寫了乙個dfs 交一遍之後最後乙個測試點沒過 應該就是n==13的時候 本地跑了一下確實將近兩秒才出來

我的判斷條件:

if(m[s][i]==0

)

if(flag)

for(y=i;y)

if(m[s+y-i][y]==1&&(s+(y-i)

if(flag)

for(y=0;y)

if(m[s-(i-y)][y]==1&&(s-(i-y)>=0

))

if(flag)

for(y=0;y)

if(m[s+(i-y)][y]==1&&(s+(i-y)

if(flag)

for(y=i;y)

if(m[s-(y-i)][y]==1&&(s-(y-i)>=0

)) flag=0

;

if(flag)

顯然寫的又笨又蠢。。

瞄一眼題解:

#include#include

#include

#include

using

namespace

std;

int a[100],b[100],c[100],d[100

];int

total;

intn;

intprint()

total++;

}void queen(int

i)

else}}

}int

main()

其中 a陣列表示的是行;b陣列表示的是列;c表示的是左下到右上的對角線;d表示的是左上到右下的對角線;

因為對於乙個對角線來說 其中的點的i和j是有確定的關係的  所以不必挨個遍歷去尋找對角線上有沒有其他的皇后 直接把判斷的複雜度降低到了o(1)!!

dalao確實是dalao 本弱雞還是太菜了

洛谷 P1219 八皇后

題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...

洛谷 P1219 八皇后

題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...

洛谷p1219 八皇后

題目描述 檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 ...