[C言語]白駿15651:NとM(3)



まずNとM(3)を行いました.これは1~4の中で簡単に見えるからです.
条件なしで出力するだけなので、これを先につかむべきだと思います.
n値とm値を入力すると、どうすればいいか分かりません.
そしてバックトラッキングとは何か分かりません.だからグーグルゲームをしました印刷方法がわかれば残りの1,2,4号も例外処理をするだけなので、答えを見て理解するようにします.

答えを理解して、自分で解いたコード

#include <stdio.h>

int arr[7] = {0, };

void BT(int n, int m, int d)
{
    int i, k;
    i = 1;
    while(i <= n)
    {
        arr[d] = i; // 이 값은 기준값이 된다.
        if (m - 1 == d) // m이 1씩 커질수록, BT를 한번씩 더 호출한다.
        {
            k = 0;
            while(k < m) // k는 배열을 출력한다. 그러기에 0부터 시작한다.
            {
                printf("%d ", arr[k]);
                k++;
            }
            printf("\n");
        }
        else
        {
            BT(n, m, d + 1);
        }
        i++;
    }
}

int main()
{
    int n,m;
    scanf("%d %d", &n, &m);
    BT(n, m, 0);
}

説明:


  • 簡単に例を挙げる.n=3,m=2の場合、出力は1/12/13/2/2/2/2/2/2/3/3/3となる.

  • BT3 2 0重複文に入ります.arr[0] = 1. BTで回帰する

  • 繰り返し文が始まるarr[1]=1,2(m)−1=1(d)であるためifが必要である.

  • arr[0]、arr[1]をk後に出力します.ここまで1/を出力しました.

  • i++に増加するとarr[1]=2となり、再出力kはarr[0],arr[1],出力1/2となる.出力を1/4に繰り返します.そしてBT終了後、2番目のコールの復帰が終了する.

  • i++がarr[0]=2の場合、再びBTが呼び出される.

  • arr[1]=1,さらにkで2/を出力し,上記3~5回のプロセスを2/に繰り返す.

  • BTはまた终わった手順を6~7回繰り返します.

  • 終わります.
  • ここでhttps://typoon.tistory.com/8の助けを得ました.同じコードと考えてもいいです.