[C言語]白駿15649:NとM(1)


の写真は少しカットされていて、シーケンスを出力するだけでいいです.
NとM(3)を見た後、他は自分でできると思っていたのですが、まだそこまではないようです.
問題のタイプを熟知していても、歯を磨いても、短期間で実力をつけたい.問題のタイプを熟知してみましょう.
最初はグーグルがランキングを検索する方法でした.swapを使用してソートします.しかし、この問題はswapを使う必要はありません.最後に答えを見てから慣れることにした.時間を変えても好転の兆しがないからだ.

他者コード

#include <stdio.h>

int n, m;
int result[1000];
int check[1000];

void DFS(int depth)
{
    int i;

    if (depth == m)
    {
        for (int i = 0; i < m; i++)
            printf("%d ", result[i]);
        printf("\n");
    }
    else
    {
        for (i = 1; i <= n; i++)
        {
            if (check[i] == 0)
            {
                result[depth] = i;
                check[i] = 1;
                DFS(depth + 1);
                check[i] = 0;
            }
        }
    }
}

int main(void)
{
    scanf("%d %d", &n, &m);
    DFS(0);
    return 0;
}
ここでhttps://velog.io/@seochan99/15649-N-%EA%B3%BC-M-1の助けを得ました.
以前はNとM(3)を解く場所で(1)を見たことがあるが,それ以外にも多くの種類を検索したことがある.しかし確かに、最初から繰り返し文を回すよりも、ifに分けてから繰り返し文を回すほうが理解できる.だからこの方法を選びました.
N=4,M=2.
depth=0,i=1の場合
1. DFS[0]-> result[0]=1 -> check[1]=1 -> DFS(1)
2.DFS[1]->(i=2の場合)result[1]=2->check[2]=1->DFS(2)
3.DFS[2]->(1,2)出力
->2番に戻り、検出を初期化し、i++(1,3)、(1,4)で出力する
->1番に戻り、検出を初期化し、同じ方法(2,1)、(2,3)、(2,4)で出力します.
リピート!!!
これはビベログの解題方法です.確かにもっと直感的なようです.
同様にして,NとM(3)解を解いた.

NとM(3)

#include <stdio.h>

int n, m;
int result[1000];

void DFS(int depth)
{
	int i;

	if (depth == m)
	{
		for (int i = 0; i < m; i++)
			printf("%d ", result[i]);
		printf("\n");
	}
	else
	{
		for (i = 1; i <= n; i++)
		{
			result[depth] = i;
			DFS(depth + 1);
		}
	}
}

int main(void)
{
	scanf("%d %d", &n, &m);
	DFS(0);
	return 0;
}
(1)checkをキャンセルし,すべての状況を出力した.逆にcheckでシーケンスを求める.
最初から繰り返し文を回しifを処理する方法と
最初はifを掛ける方法と、複文を回す方法の2つを知っていました.2つの異なる点を理解し、状況に応じて使用します.