1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include <algorithm> perv_permutation(12345); 返回值false;把数组变为54321; next_permutation(54321); 返回值false;把数组变为12345; a[] = {1,2,3,4,5}; do{ for(int i = 0; i < 5; i++) cout << a[i]; }while(next_permutation(a,a+5));//地址使用迭代器表示; 下面为手动全排列 模拟一个小人把数字放进盒子中;走到一个盒子面前,判断手中还有那些数字没放进去,把没放进去的放进去, 并标记,,递归下一步,回溯数字标记没放进去; #include <iostream> using namespace sfd; int book[100], a[100]; int ans = 0; int sum = 0; int dfs(int step) { int i; if(step == 10) {//表示前9个已经放好了; if(a[0]*100 + a[2]*10 +a[3] + a[4]*100 +a[5]*10 + a[6] == a[7]*100 + a[8]*10 + a[9]) { cout << a[0]*100 + a[2]*10 +a[3] << " + " << a[4]*100 +a[5]*10 + a[6] << " = " << a[7]*100 + a[8]*10 + a[9] << endl; ans++; } sum++; return 0; } for(int i = 1; i <= 9; i++) { if(book[i] == 0) {//判断数字还在不在手中 a[step] = i;//放进盒子里 book[i] = 1;//标记不在手中 dfs(step+1);//递归下一步 book[i] = 0;//回溯数字拿出来 } } } int main() { dfs(1); cout << ans << " " << sum << endl; return 0; } |