题解:
- #include
- int n,ret=0,a[10000][10];
- int p(int c,int s){
- int i;
- for(i=1;i<=3;i++){
- s+=i;
- if(c==9){
- if(s==n){
- a[ret][c]=i;
- ret++;
- return 1;
- }else{
- s-=i;
- continue;
- }
- }else{
- if(p(c+1,s)){
- a[ret-1][c]=i;
- return 1;
- }
- }
- }
- }
- int main()
- {
- int i,j;
- scanf("%d",&n);
- if(n>30&&n<10){
- printf("0");
- }else{
- int b=p(0,0);
- }
- printf("%d\n",ret);
- for(i=0;i<ret;i++){
- for(j=0;j<10;j++){
- printf("%d",a[i][j]);
- }
- printf("\n");
- }
- return 0;
- }
可惜的是这个递归出来只有一个解, 之后将返回值去掉, 进入函数时存放数据, 满足一次就拷贝数据至下一行数组中, 继续循环. 这样弄有点繁琐.
简单点的话, 其实可以用一个一维数组来测试组合, 符合时就将这组数拷贝到二维数组中.
- m1[10000][10],m2[10];
- void p(int total,int a){
- if (a==10){
- if (total==n) {
- for (int j=0;j<10;j++) m1[kind][j]=m2[j];// 符合要求存起来~~
- kind++;
- }
- }
- else if (total>=n) ;// 小小优化一下
- else
- for (int i=1;i<=3;i++){
- m2[a]=i;
- peiliao(total+i,a+1);// 其实这和十连 for 没什么区别...
- }
- }
网上说正解是搜索, 歪解是枚举, 枚举两遍即可完成, 说实话咱也想过要枚举, 一是觉得有点简单, 二是觉得可能会算法复杂度太高, 结果是不高...
来源: http://www.bubuko.com/infodetail-3400009.html