题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,a[3628805],sum,sum2,vis[15],k = 0;
bool f;
void dfs(int num,int len) //num是组合数现在的值,len代表位数
{
if(f) return;
if(len <= 0){a[k++] = num;return;} //全部数字已用完,尝试另一种组合
if(k == sum){f = true;return;} //全部组合都算出,返回
for(int i = 1;i <= n;i++){ //一定要从1开始到n,因为按照字典序
if(!vis[i]){
vis[i] = true;
dfs(num + i * len,len / 10);
vis[i] = false;
}
}
}
int main()
{
cin >> n;
sum2 = sum = 1;
for(int i = 1;i <= n;i++) {sum *= i;sum2 *= 10;} //sum代表全部可能的组合数量,sum2代表位数
dfs(0,sum2 / 10);
cout << k << endl;
for(int i = 0;i < k;i++) cout << a[i] << endl;
return 0;
}
一道dfs题,用len不仅可以控制一轮搜索的结束,还可以进行数的累加。另外还要加上可行性剪枝,代码附有注释这里就不赘述了。