알고리즘

BOJ 16985: Maaaaaaaaaze

minbear 2023. 5. 3. 00:10

#BOJ 16985: Maaaaaaaaaze

 

16985번: Maaaaaaaaaze

첫째 줄부터 25줄에 걸쳐 판이 주어진다. 각 판은 5줄에 걸쳐 주어지며 각 줄에는 5개의 숫자가 빈칸을 사이에 두고 주어진다. 0은 참가자가 들어갈 수 없는 칸, 1은 참가자가 들어갈 수 있는 칸을

www.acmicpc.net

#풀이

최단거리를 구하기 - bfs

5층의 배열[5][5] 쌓기 - 백트래킹

90도 회전 - 백트래킹

 

문제를 풀면서 백트래킹을 이용하여 풀었는데 인덱스를 제대로 확인하지 않아 정말 오래걸렸다......

인덱스 확인 꼭! 잘해야해!!

문제가 3차원배열로 풀어서 디버깅을 할 때도 너무 불편했다.

 

#코드

#include<iostream> //#include<bits/stdc++.h>
#include<queue>
using namespace std;
int board[5][5][5];
int board2[5][5][5];

int vis_stack[5];
int dx[6] = { 1, -1, 0, 0, 0, 0 };
int dy[6] = { 0, 0, 1, -1, 0, 0 };
int dz[6] = { 0, 0, 0, 0, 1, -1 };
queue<pair<pair<int, int>, int>> q; // x,y,z
int ans;
void func_rot(int arr[][5]) { // 90도 판회전  1: 90 2: 180  3: 270  4 : 360
	int rotarr[5][5];
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			rotarr[i][j] = arr[4 - j][i];
		}
	}
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			arr[i][j] = rotarr[i][j];
		}
	}
}
void bfs() {// 출구까지 최단 거리 구하기
	int vis[5][5][5] = { 0, };
	if (board2[4][4][4] == 1 && board2[0][0][0] == 1)
	{
		q.push({ {0, 0}, 0 });
		vis[0][0][0] = 1;
		while (!q.empty()) {
			auto a = q.front(); q.pop();
			for (int i = 0; i < 6; i++) {
				int x = a.first.first + dx[i];
				int y = a.first.second + dy[i];
				int z = a.second + dz[i];
				if (x < 0 || y < 0 || z < 0 || x >= 5 || y >= 5 || z >= 5 || vis[x][y][z] != 0 || board2[x][y][z] == 0)
					continue;
				q.push({ {x,y},z });
				vis[x][y][z] = vis[a.first.first][a.first.second][a.second] + 1;
			}
		}
	}
	if (ans <= 0) {
		ans = vis[4][4][4] == 0 ? -1 : vis[4][4][4];
	}
	else if (ans > 0) {
		if(vis[4][4][4] != 0)
			ans = ans > vis[4][4][4] ? vis[4][4][4] : ans;
	}
}
int ss[5];
int sss[5];
void func_stack(int k) { // 5개의 큐브 쌓기
	if (k == 5) {
		bfs();
		return;
	}

	for (int i = 0; i < 5; i++) {
		if (vis_stack[i] == 1)
			continue;
		vis_stack[i] = 1;
		for (int j = 1; j <= 4; j++) {
			func_rot(board[i]);
			for (int x = 0; x < 5; x++) {
				for (int y = 0; y < 5; y++) {
					board2[k][x][y] = board[i][x][y];
				}
			}
			ss[k] = i;
			sss[k] = j;
			func_stack(k+1);
		}
		vis_stack[i] = 0;
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			for (int k = 0; k < 5; k++) {
				cin >> board[i][j][k];
			}
		}
	}
	func_stack(0);
	ans = ans == -1 ? ans : ans - 1;
	cout << ans<< '\n';
	return 0;
}