#include <stdio.h>
#define SIZE 3
void print(int D[], int N) {
int i;
for(i=0;i<N;++i) printf("%2d",D[i]);
printf("\n");
// getch();
}
void throw1(int D[], int N, int n) {
int i;
if(n == N) {
print(D,N);
return;
}
else {
for(i=0;i<SIZE;i++) {
D[n]=i+1;
throw1(D, N, n+1);
}
}
}
int main() {
int D[30]={0,};
int n;
printf("입력: ");
scanf("%d", &n);
throw1(D, n, 0);
return 0;
}
위의 프로그램은 주어진 n에 따라서 각자리가 1,2,3,씩 바뀌다가
다음자리의 값이 1,2,3 으로 바뀌는 카운트 프로그램 입니다.
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
------------
n이 2가 주어졌을 경우 2자리의 카운트를 출력해 줍니다.
n이 3이라면 3자리의 카운트를, 4라면 4자리의 카운트를 출력해 줍니다.
아래의 프로그램은 위의 throw1 함수를 비순환적으로 바꾼 프로그램입니다.
#include <stdio.h>
#define SIZE 3
void print(int D[], int N) {
int i;
for(i=0;i<N;++i) printf("%2d",D[i]);
printf("\n");
// getch();
}
void throw1(int D[], int N, int n) {
int stk[1000]={0,};
int i, x, y;
stk[++stk[0]]=n;
stk[++stk[0]]=0;
while(stk[0]>0) {
i=stk[stk[0]--];
x=stk[stk[0]--];
//printf("x=%d i=%d N=%d\n", x, i, N);
//getch();
D[x]=i+1;
if(i<SIZE-1) { // 이 부분이 for문 안에서 인덱스가 증가 하는 부분에 해당합니다.
stk[++stk[0]]=x;
stk[++stk[0]]=i+1;
}
if(x==N) print(D,N);
else { // 이 부분이 throw1(D, N, n+1); 에 해당합니다.
stk[++stk[0]]=x+1;
stk[++stk[0]]=0;
}
}
}
int main() {
int D[30]={0,};
int n;
printf("입력: ");
scanf("%d", &n);
throw1(D, n, 0);
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
다항식의 곱셈 (0) | 2012.05.06 |
---|---|
2진 다항식의 곱셈 (0) | 2012.04.30 |
차집합을 구하는 프로그램 (0) | 2012.04.23 |
배열의 크기를 동적으로 늘리는 방법 (0) | 2012.04.23 |
하노이탑의 움직임을 배열을 이용하여 보여주기. (0) | 2012.04.21 |