Algorithm/Algorithm

[재귀] N과 M(1)

lee308812 2019. 10. 28. 04:58

예제 입력 1

3 1

예제 출력 1

1

2

3

예제 입력 2

4 2

예제 출력 2

1 2

1 3

1 4

2 1

2 3

2 4

3 1

3 2

3 4

4 1

4 2

4 3

예제 입력 3

4 4

예제 출력 3

1 2 3 4

1 2 4 3

1 3 2 4

1 3 4 2

1 4 2 3

1 4 3 2

2 1 3 4

2 1 4 3

2 3 1 4

2 3 4 1

2 4 1 3

2 4 3 1

3 1 2 4

3 1 4 2

3 2 1 4

3 2 4 1

3 4 1 2

3 4 2 1

4 1 2 3

4 1 3 2

4 2 1 3

4 2 3 1

4 3 1 2

4 3 2 1

 

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

www.acmicpc.net

#include <stdio.h>

constexpr int MAX_COUNT = 8;

int N, M;

bool checked[MAX_COUNT];

class vector
{
public:
	int size;
	int data[MAX_COUNT];

	vector() { size = 0; }

	void add(int item)
	{
		data[size] = item;
		size++;
	}

	int pop()
	{
		size--;

		return data[size];
	}
};

void go(int now, int cnt, vector& v)
{
	if (cnt == M)
	{
		for (int i = 0; i < v.size; i++)
		{
			printf("%d ", v.data[i]+1);
		}
		printf("\n");
		return;
	}

	for (int i = 0; i < N; i++)
	{
		if (checked[i]) continue;

		checked[i] = true;
		v.add(i);
		go(i, cnt + 1, v);
		v.pop();
		checked[i] = false;
	}
}

int main(void)
{
	vector v;

	scanf("%d %d", &N, &M);

	go(0, 0, v);
	
	return 0;
}

 

 

'Algorithm > Algorithm' 카테고리의 다른 글

[재귀] N과 M(2)  (0) 2019.10.28
순열 활용하기  (0) 2019.09.13
조합 활용하기  (0) 2019.09.13
파스칼의 삼각형  (0) 2018.10.01
[그래프] 인접 리스트  (0) 2018.08.21