15649:NとM(1)


何の問題ですか。


バックグラウンドトラッキングの問題を使用します.

これはいったい何なのか。


初めて問題を解いた時、何なのかわからない部分がありました.
  • back trackingの例から分かるように、DFSはツリーまたはグラフィックナビゲーションの概念に基づいて使用される.しかし、例では、グラフやツリーを直接使用する仮定の下で説明されているものが多く、問題では配列だけが示されています.どうすればいいの?
  • 配列をツリーまたはグラフィックに完全に移動しても、数列の値は複数回表示されます.どのようにして、それらを区別できる唯一の値を指定しますか?
  • DFSのコンセプトを見て、バックグラウンド追跡も報告しましたが、なかなか感じられませんでした.だから答えを見て一日中捕まえても解けないと思います.

    うん。その概念。


    まず私のコードではありません.まず他人のコードを引用する.
    #include <stdio.h>
    
    int r[8], n, m, v[9];
    
    void recur(int k) {
    	int i;
    	if (k == m) {
    		for (i = 0 ; i < m ; i++) printf("%d ", r[i]);
    		printf("\n");
    		return;
    	}
    	for (i = 1 ; i <= n ; i++) {
    		if (!v[i]) {
    			v[i] = 1, r[k] = i;
    			recur(k + 1);
    			v[i] = 0;
    		}
    	}
    }
    
    int main() {
    	scanf("%d%d", &n, &m);
    	recur(0);
    }
    gooooraのコード
    -> https://www.acmicpc.net/source/8974737
    backtrackingは、通常のDFSに2種類追加されます.
    条件文
  • 元の状態に復元された構文
    2つ目は最も重要です上のコードのv[i]=0の部分がその部分です.
  • この部分は後でアルゴリズム-コンセプトシリーズにアップロードする時間を別途残します.この問題を解決する方法を探すために怒った反動かもしれないが、ここ数日、この問題についての解答の後記を書きたくなかった.今使えてよかったです.

    投稿の参照

  • https://velog.io/@ntbij29/%EB%B0%B1%EC%A4%80-15649%EB%B2%88-N%EA%B3%BC-M1