BOJ 17370 육각형 우리 속의 개미

 
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <functional>

typedef long long int ll;
using namespace std;
#define INF 1234567890
#define N 200000

const int LIMIT = 1e+9;
int n, m;
int mmap[100][100];
int res = 0;

void dfs(int y, int x, int v, int d) {
	if (d == n) {
		if (mmap[y][x])
			res++;
		return;
	}

	if (mmap[y][x])
		return;

	mmap[y][x] = 1;
	d += 1;
	switch (v)
	{
	case 1:	
		dfs(y - 1, x + 1, 3, d);
		dfs(y - 1, x - 1, 5, d);
		break;
	case 2:
		dfs(y + 1, x + 1, 4, d);
		dfs(y + 1, x - 1, 6, d);
		break;
	case 3:
		dfs(y - 1, x , 1, d);
		dfs(y + 1, x + 1, 4, d);
		break;
	case 4:
		dfs(y + 1, x, 2, d);
		dfs(y - 1, x + 1, 3, d);
		break;
	case 5:
		dfs(y - 1, x, 1, d);
		dfs(y + 1, x - 1, 6, d);
		break;
	case 6:
		dfs(y + 1, x, 2, d);
		dfs(y - 1, x - 1, 5, d);
		break;
	default:
		break;
	}
	mmap[y][x] = 0;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n;
	mmap[50][50] = true;
	dfs(49, 50, 1, 0);

	cout << res;

	return 0;
}



육각형 우리 속의 개미

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 (언어별 추가 시간 없음) 1024 MB 262 159 90 77.586%

문제

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

img1

개미 우리의 모습

곤충 관찰이 취미인 유이는 세 정육각형이 서로 맞닿아 있는 어떤 점 위에 개미를 하나 올렸다. 이렇게 우리에 올라온 개미는 그 자신에게 미지의 영역인 우리를 페로몬을 뿌리며 탐색하기 시작했다. 처음 개미는 점과 연결된 세 변 중 하나를 향해 이동을 시작하는데, 편의를 위해 이 첫 번째 이동이 북쪽을 향하도록 돌려서 보자.

만약 개미가 변이 세 갈래로 갈라지는 점에 도착하면, 자신이 이동해온 변을 제외한 나머지 두 변 중 하나를 골라 그 방향으로 회전하여 탐색을 계속한다.

img2

연두색은 시작 지점, 초록색은 개미가 탐색하며 페로몬을 뿌린 경로. 검은색은 개미, 주황색은 다음 이동을 위해 선택 가능한 두 변을 나타낸다.

개미가 이전에 방문했던, 즉, 페로몬이 뿌려진 지점에 도착하면 이곳이 이미 익숙한 영역이라는 착각에 빠지고 더 이상의 탐색을 멈춘다. 이렇게 탐색을 멈췄을 때, 방향을 회전한 횟수가 정확히 N번이 되는 경우의 수를 구해보자.

img3

방향을 7번 회전하는 두 경로. 페로몬의 궤적은 동일해도 개미의 이동 방향에 따라 경로를 구별하도록 한다.

입력

첫 번째 줄에 하나의 정수 N(1 ≤ N ≤ 22)이 주어진다.

출력

첫 번째 줄에 개미가 방향 회전을 N번 하고 멈추는 경우의 수를 출력한다.

예제 입력 1

2

예제 출력 1

0

예제 입력 2

5

예제 출력 2

2

예제 입력 3

8

예제 출력 3

8

출처

Contest > 전국 대학생 프로그래밍 대회 동아리 연합 여름 대회 > UCPC 2019 예선 I번