八皇后 簡單深搜

2021-08-01 21:39:47 字數 1142 閱讀 3637

檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列有且只有乙個,每條對角線(包括兩條主對角線的所有平行線)上至多有乙個棋子。

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

行號 1 2 3 4 5 6

列號 2 4 6 1 3 5

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

//以下的話來自usaco官方,不代表洛谷觀點

特別注意: 對於更大的n(棋盤大小n x n)你的程式應當改進得更有效。不要事先計算出所有解然後只輸出(或是找到乙個關於它的公式),這是作弊。如果你堅持作弊,那麼你登陸usaco training的帳號刪除並且不能參加usaco的任何競賽。我警告過你了!

輸入格式:

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

輸出格式:

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

6
2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4

思路 :常見的 求八皇后問題在這道題的最後一組樣例上是會超時的,兩層for迴圈求搜太慢了,lrj的紫書中 有乙個用if條件去判斷的 會完美的過這道題下面上**吧:

#include#include#includeusing namespace std;

int n;

int tot;

int a[20];

int vis[300][300],map[20][20];

void dfs(int cur)

printf("%d\n",a[n-1]+1);

} return ;

}/*for(int i=0;i

}if(ok)

}*/// 上面就是超時的寫法

for(int i=0;i

}int main()

八皇后(深搜)

八皇后 總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1...

八皇后問題(dfs深搜)

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

題目 八 n皇后C 解 深搜

回溯法也稱試探法,用於尋找乙個問題的可行解。該方法首先暫時泛起問題規模大小的閒置,從最小規模開始將問題的候選解按某種順序逐一列舉和檢驗,選擇乙個可行的候選解,然後擴大規模,繼續試探。打到要求的規模時,所有的候選解就形成了問題的可行解。8皇后和n皇后的問題就是基於回溯法解決的。題目要求 在乙個8 8的...