題目出處:《資訊學奧賽一本通》例5.1。
題目描述
素數環:從 \(1\) 到 \(n(2 \le n \le 20)\) 這 \(n\) 個數擺成乙個環,要求相鄰的兩個數的和是乙個素數。
輸入格式
輸入包含乙個整數 \(n(2 \le n \le 20)\) 。
輸出格式
按字典序從小到大的順序輸出所有排列方案,每個排列方案佔一行。每行的 \(n\) 個數之間由乙個空格分隔。
樣例輸入
2
樣例輸出1 2
2 1
問題分析
很明顯,這是一道可以用搜尋解決的問題,我們可以採用「回溯」思想,使用深度優先搜尋解決這個問題。
我們用ans
陣列來存放我們當前遍歷到的答案,ans[id]
用於表示當前排列的第 id 個數是什麼。所以我們可以開乙個函式void f(int id)
來表示要在第 id 個位置放數,我只需要從 1 到 n 遍歷每乙個數(我這裡假設是 i),並判斷 i 是否能放。
在第 id 個位置能放 i 當且僅當:
這樣,我們遞迴地呼叫f(id)
,當id>n
時就是我們遞迴的邊界條件;一旦id>n
就說明我找到了一種方案。
實現**如下:
#includeusing namespace std;
int ans[22], n;
bool isp(int a)
void output()
void f(int id)
for (int i = 1; i <= n; i ++)
}if (flag)
}}int main()
搜尋入門練習題8 選書 題解
題目出處 資訊學奧賽一本通 例5.7 題目描述 學校放假時,汪老師有a b c d e五本書,要分給參加培訓的張 王 劉 孫 李五位同學,每人只能選一本書。老師實現讓每個人將自己喜歡的數填寫在如下的 中。然後根據他們填寫的表來分配書本,希望設計乙個程式幫助老師求出所有可能的分配方案,使每個學生都滿意...
搜尋入門練習題5 八皇后問題 題解
題目描述 輸出格式 輸出乙個整數,用於表示八皇后問題的放置方案。題目分析 首先我們用 x,y 來表示棋盤上第 x 行第 y 列的格仔的座標。那麼,兩個皇后 x 1,y 1 和 x 2,y 2 會互相攻擊當且僅當滿足如下條件之一 我們可以用深度優先搜尋來解決這道題。我們可以發現的是,要想在 8 tim...
搜尋練習題(1)八皇后
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...