two two four的解 全排列與深搜

2021-10-22 03:36:48 字數 2195 閱讀 8270

t w o ,f u r分別是0,1,2,3,4,5,6,7,8,9裡面的六個數字。我們要找到它們組合使得two+two=four的等式成立,即

~~

two+ two

----------

~

four

1.for迴圈巢狀有點麻煩,我們直接使用c++自帶的全排列函式來完成(next_permutation)

2.我們使用map來保證不會有重複的組合,因為10個數字我們只使用了前6個,所以全排列會有重複項

3.通過f=0,t=0 continue適當提速

#include

#include

#include

using

namespace std;

int num[10]

;int ans=0;

map<

int,

int> m;

intmain()

}while

(next_permutation

(num,num+10)

);cout<<

"一共有"

<

"種解答"

<

return0;

}// two

// two

//four

// owtruf

深搜遞迴函式引數解釋:

vector a;//用來存放組合的數字

map m; //用存放哪些數字已經用過了,這樣確保了數字的唯一性

cnt; //記錄了當前a的深度,也可以沒有這個引數,用a.size()來代替

注意點:

1.遞迴的a,m,cnt是需要回溯的,cnt是用的傳參+1,所以不用特意再減一,因為cnt+1沒有改變cnt的值

2.剪枝的說明

一. f=1,說明t一定要大於5

二. 結果一定滿足oo=r||r+10

三. 結果一定滿足ww+(o*o)%10=u||u+10

#include

#include

#include

using

namespace std;

int ans=0;

//最終的解法

void

check

(vector<

int> num)

}void

dfs(vector<

int> a,map<

int,

int> m,

int cnt)

//深搜剪枝1 大於5才能進1

if(cnt==

1&&a[0]

<6)

return

;//深搜剪枝2 個位數不滿足要求

if(cnt==

3&&a[1]

*2!=a[2]

&&a[1]

*2!=10

+a[2])

return

;//深搜剪枝3 十位數不滿足要求

//計算一段程式執行的時間

#include

#include

using

namespace std;

intmain()

endtime =

clock()

;//計時結束

cout <<

"the run time is: "

<<

(double

)(endtime - starttime)

/ clocks_per_sec <<

"s"<< endl;

return0;

}

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

46 全排列 47 全排列II

46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...

輸出全排列(C 全排列函式)

請編寫程式輸出前n個正整數的全排列 n 10 並通過9個測試用例 即n從1到9 觀察n逐步增大時程式的執行時間。輸入格式 輸入給出正整數n 10 輸出格式 輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a 1,a2,an 排在序列b1,b2,bn之前,如果存在k使得...