回溯法解題報告

2021-08-20 14:52:13 字數 2563 閱讀 3793

題目一:

hdoj 1016

問題描述

如圖所示,環由n個圓組成。將自然數1,2,...,n分別放入每個圓圈中,並且相鄰兩個圓圈中的數字總和應為素數。

注意:第乙個圓圈的數量應該始終為1。

輸入

n(0輸出

輸出格式如下所示。每行代表從1開始順時針和逆時針旋轉的一系列圓圈數字。數字的順序必須符合上述要求。按照字典順序列印解決方案。

你要編寫乙個完成上述過程的程式。

在每個案例後列印乙個空行。

示例輸入

示例輸出

case 1:

1 4 3 2 5 6

1 6 5 2 3 4

case 2:

1 2 3 8 5 6 7 4

1 2 5 8 3 4 7 6

1 4 7 6 5 8 3 2

1 6 7 4 3 8 5 2

解題思路:

因為輸入的範圍是(0,20)並且相鄰的數必不重複,所以相鄰兩個數相加最大為37,因此可以先找出(2,38)內的所有素數,建乙個陣列,對應的位置是素數時標記為1。因為往圓圈中填數時是按照順時針或者逆時針方向,所以只要保證當前填入的數和上乙個數之和為素數,並且填到第n個數時保證第n個數和第乙個數(1)的和也是素數,那麼得到的這個解就是正確的。

程式:

#include

#include

using

namespace

std;

const

intn = 40;

intn, x = 0;

intnum[n];

//儲存(1,40)內所有的素數

intfind[n]; 

//記錄(1, 20)內的數是否出現過

vector

<

int> a;

bool

findnum(

intk

) //

查詢該數是否出現過

bool

task(

intk

) //

判斷與前乙個數相加是否為素數

void

placenum(

intk)

}else }

}}

intmain() }

if(s == 1)

num[i] = 1;

}while

(cin

>>n)

return0;

}

題目二:

hdoj 2563

問題描述

在一無限大的二維平面中,我們做如下假設:

1,每次只能移動一格; 

2,不能向後走(假設你的目的地是「向上」,那麼你可以向左走,可以向走走,也可以向上走,但是不可以向下走); 

3,走過的格仔立即塌陷無法再走第二次; 

求走n步不同的方案數(2種走法只要有一步不一樣,即被認為是不同的方案)。

輸入

首先給出乙個正整數c,表示有c組測試資料

接下來的c行,每行包含乙個整數n(n <= 20),表示要走n步。

輸出

請程式設計輸出走ñ步的不同方案總數; 

每組的輸出佔一行。

示例輸入

示例輸出

解題思路:

回溯法思路(當n比較大時會超時):

因為輸入的資料是從(0,20],所以可以開乙個比較大的陣列來記錄某個位置是否走過,如果走過則標記為1,沒走過時為0。這時可以把移動分為3種情況,第一種為向前移動(陣列行數+1),第二種為向左移動(陣列列數-1),第三種為向右移動(陣列列數+1),移動的次數大於n時則結束。

遞推思路:

當移動第n步時有兩種情況,一種是可移動的位置有3個(當第n-1步為向上移動時),另外一種是可移動的位置有2個(當第n-1步為向左或向右移動時)。可移動的位置有2個的所有可能的情況的個數等於移動第n-1步所有可能的情況的個數乘以2,可移動的位置有3個的所有可能的情況的個數等於第n-1步為向上移動的情況的個數,而第n-1步為向上移動的情況的個數又等於第n-2步的所有可能的情況的個數,所以遞推的公式為:

count[n] = 2 * count[n-1] + count[n-2]

(count陣列用來存放移動第n步所有可能的情況的個數,初始化第0步為1,第1步為3)

程式:

#include

using

namespace

std;

intmain()

return0;

}

「通用解題法」之回溯中的「剪枝」

回溯法採用 試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。摘自百科 我的理解就是 採用試探性的搜尋原則,按優先條件向前進發,能進則進,無...

二分法解題報告

題目 派 描述 我的生日要到了!根據習俗,我需要將一些派分給大家。我有 n個不同口味 不同大小的派。有 f個朋友會來參加我的派對,每個人會拿到一塊派 必須乙個派的一塊,不能由幾個派的小塊拼成 可以是一整個派 我的朋友們都特別小氣,如果有人拿到更大的一塊,就會開始抱怨。因此所有人拿到的派是同樣大小的 ...

回溯法,回溯法解裝載問題

利用回溯法解問題時一般按以下三步驟 1 定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度優先策略搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋 二 回溯法應用 裝載問題 一批貨櫃共n個要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi且w1 w2 wn c1 c2 試確定乙個...