PS/알고스팟

[알고스팟] 피크닉(PICNIC) - C++

발효홍삼 2022. 2. 19. 17:35
728x90
  • 문제

https://algospot.com/judge/problem/read/PICNIC

 

algospot.com :: PICNIC

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

algospot.com

  • 풀이
#include <iostream>
#include <cstring>

using namespace std;

int c,n,m; // 테스트 케이스의 수 c, 학생의 수 n, 친구 쌍의 수 m
int f[11][11];
bool check[11]; //짝을 지었는지 확인

int solve()
{
	int x = -1;

	for (int i = 0; i < n; i++) // 가장 빠른 학생 찾기
	{
		if (!check[i])
		{
			x = i;
			break;
		}
	}

	if (x == -1) return 1;

	int ans = 0;

	for (int i = x + 1; i < n; i++)
	{
		if (!check[i] && f[x][i])
		{
			check[x] = check[i] = 1; // 짝이 정해짐
			ans += solve();
			check[x] = check[i] = 0; //짝 해제
		}
	}

	return ans;
}

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> c;

	while(c--)
	{
		cin >> n >> m;
		memset(f, 0, sizeof(f));
		memset(check, 0, sizeof(check));


		for (int i = 0; i < m; i++)
		{
			int x, y;
			cin >> x >> y;
			f[x][y] = f[y][x] = 1; 
		}

		cout << solve() <<"\n";
	}

	return 0;
}
  • 느낀 점

고민하다 결국 종만북을 보고 풀었다. 아직 재귀에 대해 미숙한 점이 있다.

728x90