알고리즘

[BOJ / DFS] 17370 육각형 우리 속의 개미

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

 

17370번: 육각형 우리 속의 개미

무한히 많은 정육각형이 서로 맞닿아 놓인 형태의 개미 우리가 있다. 다음 그림과 같은 형태이고, 하얀색 변으로만 개미가 다닐 수 있다. 개미 우리의 모습 곤충 관찰이 취미인 유이는 세 정육각

www.acmicpc.net

 

17370 육각형 우리 속의 개미

알고리즘 : Bitmask / DFS

육각형 필드를 배열에 넣는 방법이 중요한 문제입니다. 육각형 이전 움직임에 따른 다음 움직임을 6*2 배열에 넣어두고 현재 배열의 상태를 최대 길이가 44이므로 (오른쪽 왼쪽으로 22칸씩 진행가능하므로) long long int를 이용한 비트마스크로 현재 방문 상태를 저장합니다. 이를 활용해 풀이 가능합니다.

 

 

 

< CODE >

#include <iostream>
#include <vector>
#include <cmath>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>

using namespace std;

#define MAX 45

int result = 0;
//0 up 1 up right 2 down right 3 down 4 down left 5 up left
int dy[6][2] = {{-1,-1},{-1,1},{-1,1},{1,1},{-1,1},{-1,1}};
int dx[6][2] = {{-1,1},{0,1},{1,0},{-1,1},{-1,0},{0,-1}};
int dValue[6][2] = {{5,1},{0,2},{1,3},{4,2},{5,3},{0,4}};

long long int h[MAX] = {0,};

int n;

void dfs(int y, int x, int move, int last)
{
	if(move >= n)
		return;
		
	for(int i = 0; i < 2; i++)
	{
		pair<int,int> to = {y + dy[last][i], x + dx[last][i]};
			
		if(h[to.first] & (1 << to.second))
		{
			if(move == n - 1)
				result++;
		}
		else
		{
			long long int back = h[to.first];
			h[to.first] |= (1 << to.second);
			dfs(to.first, to.second, move + 1, dValue[last][i]);
			h[to.first] = back;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	
	h[22] |= (1 << 22);
	h[23] |= (1 << 22);
	
	dfs(22,22,0,0);
	
	cout << result << '\n';
	  
	return 0;
}

시간 : 12ms

 

태그 : #BOJ 17370 #백준 17370

 

'알고리즘' 카테고리의 다른 글

2020 KAKAO BLIND RECRUITMENT 1차예선 풀이  (0) 2021.09.03
2021 KAKAO BLIND RECRUITMENT 1차예선 풀이  (0) 2021.08.27
[BOJ / 2-SAT] 11281 2-SAT - 4  (0) 2021.07.26
[BOJ / 2-SAT] 11280 2-SAT - 3  (0) 2021.07.25
[BOJ / SCC] 4196 도미노  (0) 2021.07.20