순간을 성실히, 화려함보단 꾸준함을

[ boj : 1941 ] 소문난 칠공주 본문

알고리즘,SQL/백준,BOJ

[ boj : 1941 ] 소문난 칠공주

폭발토끼 2021. 8. 1. 15:41

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

 

1941번: 소문난 칠공주

총 25명의 여학생들로 이루어진 여학생반은 5*5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생이 두각을 나타내며 다른 학생들을 휘어잡기 시작

www.acmicpc.net

문제 : 읽고 오세요 ㅠㅠ 

해설 : 어우우우우우ㅜ울ㅇ눌ㄴ울 ....이런문제 한번 말리면 끝도 없이 말려서 너무 힘드네요 ㅠㅠ

처음에는 그냥 dfs+백트래킹 인줄 알았는데...이렇게 되면 현재 있는 위치에서만 갈수있는데를 바라볼뿐 다른 칸으로는 나아가지 못하는 문제가 있습니다.

XXOXX

OOOOO

XXOXX

XXXXX

XXXXX

이런 경우는 전혀 찾지를 못하게 되는 것이죠 ㅠㅠㅠ 그래서 방법을 바꾸었습니다. 그냥 미리 7개를 뽑아놓고 이 7개 중 'S'가 4개 이상인지 그리고 전부 연결되어 있는지를 확인하는 로직으로요...이게 제일 마음이 편한 것 같습니다.

선택한 정점들이 전부 연결되어있는지 확인하는 방법은 disjoint-set 개념을 적용시켜 부모의 정보들을 확인하며 체크할 수 있습니다.

#include<bits/stdc++.h>

using namespace std;

bool visit[25];
int ans,parent[7];
string board[5];
set<int> s;

void cb(int n, int r);
bool solve();
void union_parent(int x, int y);
int get_parent(int x);

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	for (int i = 0; i < 5; i++)
		cin >> board[i];
	cb(25, 7);
	
	cout << ans;
	return 0;
}
void cb(int n, int r)
{
	if (r == 0) {
		if (solve()) {
			ans++;
		}
		return;
	}
	else if (n < r)return;
	
	visit[n - 1] = true;
	cb(n - 1, r - 1);

	visit[n - 1] = false;
	cb(n - 1, r);
}
bool solve()
{
	vector<pair<int, int>> v;
	int num = 0, cnt = 0;
	int memo[5][5], check1[5][5];
	int dx[] = { -1,1,0,0 }, dy[] = { 0,0,-1,1 };


	for (int i = 0; i < 25; i++)
		if (visit[i]) {
			if (board[i / 5][i % 5] == 'S')cnt++;
			v.push_back({i/5,i%5});
		}
	if (cnt < 4)return false;
	
	for (int i = 0; i < 7; i++)parent[i] = i;

	for (int i = 0; i < 7; i++)
		for (int j = i + 1; j < 7; j++)
			if (abs(v[i].first - v[j].first) + abs(v[i].second - v[j].second) <= 1)
				union_parent(i, j);
	for (int i = 0; i < 7; i++)
		if (get_parent(0) != get_parent(i))
			return false;
	return true;
}
void union_parent(int x, int y)
{
	x = get_parent(x);
	y = get_parent(y);

	parent[y] = x;
}
int get_parent(int x)
{
	if (x == parent[x])return x;
	return parent[x] = get_parent(parent[x]);
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 1736 ] 쓰레기 치우기  (0) 2021.08.08
[ boj : 2812 ] 크게 만들기  (0) 2021.08.07
[ boj : 14431 ] 소수 마을  (0) 2021.07.30
[ boj : 21277 ] 짠돌이 호석  (0) 2021.07.25
[ boj : 21276 ] 계보 복원가 호석  (0) 2021.07.18