I have an idea to solve this problem. But it is not successful. I use d[l] to record some value (the other values are obtained from d[l]). Could you help me?
Code:
#include <stdio.h>
#define max_rank 100
#define max_length 1000
void copy(int c[max_rank], int e[max_rank], int rank) {
int i;
for (i=0;i<rank;i++) {
e[i]=c[i];
}
}
int main() {
int i, j, l, n=4, rank=4;
struct vector
{
int a[max_rank];
int i;
};
typedef struct vector vector;
vector d[max_length];
vector c;
for(i=0; i<rank; i++){
if(i==0){
c.a[i]=n;
}
else{
c.a[i]=0;
}
}
c.i=0;
l=0;
printf("c=");
for(j=0; j<rank; j++){
printf("%d, ", c.a[j]);
}
printf("\n");
while(1){
for(i=c.i; i<rank-1; i++){
if(c.a[i-1]>0 && i>0){
for(j=0; j<rank; j++){
d[l].a[j]=c.a[j];
}
d[l].i=i;
printf("d=");
for(j=0; j<rank; j++){
printf("%d, ", d[l].a[j]);
}
printf("\n");
l++; printf("d[%d].i=%d, l=%d\n",l-1, d[l-1].i,l);
}
c.a[i]=c.a[i]-1;
c.a[i+1]=c.a[i+1]+1;
/*
if(i==rank-2 && c[rank-2] != 0){
i=rank-3;
}
*/
printf("c=");
for(j=0; j<rank; j++){
printf("%d, ", c.a[j]);
}
printf("\n");
}
for(j=0; j<rank; j++){
c.a[j]=d[l-1].a[j];
}
c.i=d[l-1].i;
l--;
if(l==-1){
break;
}
}
return 0;
}