普機場之深度優先搜尋 待補)

2021-08-28 09:08:13 字數 1647 閱讀 6185

題目提供者評測方式雲端評測標籤usaco高效能

難度普及/提高-

時空限制1000ms / 128mb

提交 題解

檢查乙個如下的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大小的。

輸出格式:

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

輸入樣例#1:複製

6
輸出樣例#1:複製

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4

題目翻譯來自nocow。

usaco training section 1.5

很經典的一道dfs,雖然以前寫過,但畢竟沒有自己的想法,還是有必要再寫一遍的;

首先用陣列vis[ i ] = j 來表示皇后放在第 i 行第 j 列,用函式dfs(x)來搜尋當前第x行皇后可以放的位置

因為是按行放的,所以不用擔心行是否放過,列也是很好判斷,對於對角線就要注意了,我剛開始推的是皇后資深行列的差相等就對應左對角線,其實是不對的,具體可以自行找資料試一下,對於在對角線的兩個皇后我們可以發現它們正好組成正方形,所以只需要判斷兩者行和列的差是否相等就好了,不過還需要開o2優化orz

#pragma gcc optimize("o2")

#pragma gcc optimize("o3")

#includeusing namespace std;

int vis[20];//vis[i] = j 表示i列放在j

int ans,n;

void dfs(int x)

return ;

}int j;

for (int i = 1;i <= n;i ++)//當前行佔列

if (j == x)

}}int main()

深度優先搜尋之深度體驗

迷宮有n行m列的單元格組成 n和m都小於等於50 每個單元格內要麼是空地,要麼是障礙物。找到一條從迷宮的起點通往迷宮內任意一點的最短路徑。注意 障礙物是不能走的,也不能走到迷宮之外。include include int n,m,p,q,len,min 99999999 int a 51 51 bo...

演算法之深度優先搜尋和廣度優先搜尋

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。它沿著 樹的深度 遍歷樹的節點,盡可能深的 搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...