c·c++/c 프로그래밍

순환 카운트함수를 비순환 카운트함수로

바로이순간 2012. 4. 27. 11:39

#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;

}