剛參加完藍橋杯 弱雞錯了好幾道。。回頭一看確實不難 寫起來還是挺慢的
於是開始了刷題的道路
藍橋杯又名搜尋杯 暴力杯。。。於是先從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 53 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其中 a陣列表示的是行;b陣列表示的是列;c表示的是左下到右上的對角線;d表示的是左上到右下的對角線;#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()
因為對於乙個對角線來說 其中的點的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 ...