64,654
社区成员
发帖
与我相关
我的任务
分享
//输入第一个数n(1<=n<=10)表示符合要求的数共n位,后面跟n个数Mi(0<=i<=n-1,1<=Mi<=10),代表从左到右在第0..n-1个位置上有0..Mi-1共Mi种可能
//输出符合上面要求的所有数
#include <stdio.h>
#include <assert.h>
#define MAX 10
int d[MAX];
int M[MAX];
int n,j;
void loop(int L) {
int i;
if (L==n) {
for (i=0;i<n;i++) printf("%d",d[i]);
printf(" ");
return;
} else {
for (i=0;i<M[L];i++) {
d[L]=i;
loop(L+1);
}
}
}
void main() {
scanf("%d",&n);
assert(1<=n && n<=MAX);
for (j=0;j<n;j++) {
scanf("%d",&M[j]);
assert(1<=M[j] && M[j]<=MAX);
}
loop(0);
}
void dfs(int d,vector<string>&vs,vector<int>&idx){
if(d==vs.size()){
transform(vs.begin(),vs.end(),idx.begin(),
ostream_iterator<char>(cout),[](const string&s,int i){return s[i];});
cout<<endl;
return;
}
for(;idx[d]<vs[d].size();++idx[d]) dfs(d+1,vs,idx);
idx[d]=0;
}
//
vector<int> idx(vs.size(),0);
dfs(0,vs,idx)