白駿15663 NとM(9)

7612 ワード

質問する


N個の自然数とM個の自然数が与えられた場合、以下の条件を満たす長さMのすべての数列を求めるプログラムを作成します.
  • N個の自然数からM個の数列
  • を選択する.

    入力


    1行目はNとMです.(1 ≤ M ≤ N ≤ 8)
    2行目にはN個の数字があります.10,000以下の自然数を入力します.

    しゅつりょく


    各行に問題条件を満たす数列を出力します.重複する数列は複数回出力できません.各数列はスペースで区切らなければなりません.
    数列は予め増加した順序で出力しなければならない.

    方法


    正直難しいです.結局、他人の答えを見て解けた.
    重要なのは、前の値を格納する変数、check配列を指定し、この数が使用されていることを示します.
    はい.dfsの問題はいつもこのように解決できるようです...でもまだ解けないようです.△すべての回帰問題がそうだったようだ.解き続けよう.

    コード#コード#

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int N, M, res[8];
    bool check[8];
    void dfs(int x[], int k ){
    	if(k == M){
    		for (int i = 0; i < M; i++) 
    			printf("%d ",res[i]);
    		printf("\n");
    		return;
    	}
    	int prev = -1;
    	for (int i = 0; i < N; i++){
    		if(!check[i] && (prev != x[i])){
    			check[i] = true;
    			prev = x[i];
    			res[k] = x[i];
    			dfs(x,k +1);
    			check[i] = false;
    		}
    	}
    }
    int main(void){
    	scanf("%d %d",&N,&M);
    	int a[N];
    	for (int i = 0; i < N; i++) scanf("%d",&a[i]);
    	sort(a,a+N);
    	dfs(a,0);
    }