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使得...