DFS技巧有關的訓練題

2021-09-23 22:31:34 字數 4267 閱讀 2641

這個是板子

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)

#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)

#define mset(var,val) memset(var,val,sizeof(var))

#define ll long long

#define eps 0.000001

#define inf 0x7f7f7f7f

#define llinf 1e18

#define exp 0.000001

#define pai 3.141592654

#define random(x) rand()%(x)

#define lowbit(x) x&(-x)

inline

intread()

while

( a>=

'0'&& a<=

'9')

return x*y;

}

題意:

給一些字串,按照特定順序輸出。

題解:dfs回溯的順序。或者奇偶順序。

以下是核心**(去掉了板子)

#define n 19

int n;

char a[n][26

];void

dfs(

int dep)

return;}

printf

("%s\n"

,a[dep*2-

1]);

dfs(dep+1)

;printf

("%s\n"

,a[dep*2]

);}int

main()

dfs(1)

;}return0;

}

題意:

乙個人被困在方形迷宮內,起點是@,能走的地方是『.』也就是黑格,不能走的地方是#也就是紅格。求這個人踩到多少個黑格?

input

6 9

....#.

.....#

......

......

......

......

......

#@...#

.#..#.

11 9

.#.........

.#.#######.

.#.#.....#.

.#.#.###.#.

.#.#..@#.#.

.#.#####.#.

.#.......#.

.#########.

...........

11 6

..#..#..#..

..#..#..#..

..#..#..###

..#..#..#@.

..#..#..#..

..#..#..#..

7 7..#.#..

..#.#..

###.###

...@...

###.###

..#.#..

..#.#..

0 0

output
45596

13

題解一:

基礎dfs,子問題求解。

int n,m;

char ma[50]

[50];

intdfs

(int x,

int y)

intmain()

}}return0;

}

題解二:

基礎bfs,多狀態計數。

int n,m;

char ma[50]

[50];

struct node };

int nx[4]

[2]=

;queueq;

int ans =

0; bool vis[50]

[50];

intbfs

(int x,

int y)}}

return ans;

}int

main()

}}return0;

}

題意:

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。

現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。

給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。

input

9

5 2 1 5 2 1 5 2 1

output
6
題解:

雙階段dfs,加極限剪枝。

sort

(a+1

,a+n+

1,cmp)

;

剪枝一:

排序。 木棍由大到小排序。理由:長度小,而且數量多的木棍,相比於同樣總長的,長度大,數量少的木棍,更加靈活。例如:5和4能組成9。5,2,1和1也能組成9,但是如果當前在組第3組木棍,還有兩組木棍要組合,那麼我肯定優先選擇5和4,這樣,才能把更多可能性給第4組和第5組,第4組和第5組才更有可能組成長度為規定的長木棍。

while

( a[i]

== a[i+1]

) i++

;

剪枝二:

去重。a[i] 有相同值時候,我們只dfs第乙個值(在dep層dfs),下乙個階段(在dep+1層)我們會dfs,a[i+1],(在dep+2層)dfs,a[i+2]。如果在dep層dfs,a[i+1],那麼會多次列舉,走相同的dfs。每一層都多走,相當浪費時間資源。

if

( len == a[i]

|| len == pp )

return

0;

剪枝三:

當我們列舉的這根長木棍剩餘值,正好等於,當前列舉的a[i]時,我們用a[i]填補列舉的這根長木棍,如果,a[i]以後的短木棍都無法拼湊成剩下的長木棍,那麼我們用比a[i]更小的短木棍更不可能拼湊成剩下的長木棍。栗子:len5,pp6,a[i] == 5 ,剩下的短木棍為4,4,3。代入驗證即可。

剪枝四:

當前a[i]放到,當前列舉的長木棍中(當前長木棍未放入任何值)之後,都無法拼接剩下的長木棍,那麼,pp這個值肯定是無法使用的。

if

( len < a[cnt]

)return

0;

剪枝五:

現在需要的短木棍長度,比最短的那個短木棍還小。那麼pp的值不合適。

bool cmp

(int x,

int y)

int n,t,sum=

0,cnt=

0,a[70]

,res,vis[70]

,pp;

intdfs

(int len,

int sta,

int now)

if( len ==0)

if(dfs(pp,

1,now+1)

)return1;

if( len < a[cnt]

)return0;

for(

int i = sta; i <= cnt ; i++)}

return0;

}int

main()

}sort

(a+1

,a+n+

1,cmp)

;for

(int i=a[1]

;i<=sum/

2;i++)if

(sum%i==0)

}printf

("%d"

,sum)

;return0;

}

python基礎技巧綜合訓練題2

1,判斷乙個字串中的每乙個字母是否都在另乙個字串中,可以利用集合的特性來解,集合的元素如果存在,再次更新 update 是新增不進集合的,那麼集合的長度還是跟原來一樣,如果新增進去,集合長度就會增加 a ghost b hello,can you help me install ghost wind...

DFS深搜有關數字和的問題

輸入 n,k 題目 給n個數字,有多少組數字加起來等於k 使用dfs深搜,如下 include include include include include include includeusing namespace std int n,k,a 25 int sum,ans void dfs i...

dataframe中有關inf的處理技巧

numpy中inf的相關文件 ieee 754浮點表示 正 無窮大。np.ninf inf np.inf inf np.log 0 inf np.array 1 2 0 碰到的最多的情況 array inf,inf 目前沒看到有什麼好處,只是單純用inf表示無窮大,方便理解和表示。對使用者而言,對i...