전공/종만북

브루트포스 155p 소풍

xkdlaldfjtnl 2020. 9. 18. 15:16

 

algospot.com/judge/problem/read/PICNIC

 

algospot.com :: PICNIC

소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로

algospot.com

친구끼리만 짝이 되게끔 만들어야 한다. 

친구끼리만 짝이 되는 경우의 수는?

 

모든 경우를 다 따진 후에 친구끼리만 짝 되었을 때 세면 된다.

 

brute force 를 사용할 수 있는 경우는 입력이 작아서, 시간초과가 나지 않을때는 가능한 것 같다. 

위 문제는 이걸 위해서 만들어진 문제기 때문에 상관없다만 조심하자 

 

아 그리고 또 항상 주의해야 할것이 중복되게 세지 않는 것이다. 중복이 생기는 순간 원하는 답을 얻을 수 없다.

 

이건 잘 생각해서 어떤 방향으로 채워나갈지 진행할지 생각하고 코드 짜자.

 

 

 

#include<iostream>
using namespace std;
#define MAX 15

int C, n, m;
bool fr[MAX][MAX] = { false, };
bool done[MAX] = { false, };

int matching(int num) {
	if (num == 0) {
		return 1;
	}
	int ret = 0;
	int one = -1;
	for (int i = 0; i < n; i++) {
		if (!done[i]){
			one = i;
			break;
		}
	}
	for (int i = one + 1; i < n; i++) {
		if (done[i]) continue;
		if (fr[one][i]) {
			done[one] = true;
			done[i] = true;
			ret += matching(num - 2);
			done[one] = false;
			done[i] = false;
		}
	}

	return ret;
}

int main() {
	cin >> C;
	while (C--) {
		for (int i = 0; i < MAX; i++) {
			done[i] = false;
			for (int j = 0; j < MAX; j++) {
				fr[i][j] = false;
			}
		}
		cin >> n >> m;
		for (int i = 0; i < m; i++) {
			int a, b;
			cin >> a >> b;
			fr[a][b] = true;
			fr[b][a] = true;
		}
		
		cout << matching(n) << "\n";
	}
}