알고리즘

16954 움직이는 미로 탈출 C++ DFS deque

미니아__ 2021. 9. 5. 16:09

캐릭터는 상하좌우대각선, 제자리로 움직일 수 있다.

벽은 계속 아래로 내려가다가 사라진다.

 

벽의 크기는 8이므로 8번 벽이 내려가는동안 캐릭터가 살아있다면 목적지에 100% 도착이 가능하다.

 

여기서 곤란한것은 맵을 벽으로 내리고, DFS돌리고난후 맵을 원래대로 복구해야된다는 것인데,

벽은 계속 맨아래에 있는것이 전부 사라지므로, 위로 빈공간을 생성시키면 된다.

 

양쪽으로 삽입이 가능한 deque를 사용하면 바로 적용할 수 있다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <memory.h>
#include <deque>
using namespace std;

int n, m, k;
int dx[8] = { 0,0,1,-1 ,1,1,-1,-1};
int dy[8] = { 1,-1,0,0 ,-1,1,-1,1};
deque<string> vmap;
int ans = 0;

void dfs(int y, int x, int cnt)
{
	if (cnt >= 8)
	{
		ans = 1;
		return;
	}
	if (y == 0 && x == 7)
	{
		ans = 1;
		return;
	}
	string savestr = vmap[7];
	string inputstr = "........";

	if (cnt >= 1)
	{
		vmap.pop_back();
		vmap.push_front(inputstr);
	}
	if (vmap[y][x] == '#')
	{
		if (cnt >= 1)
		{
			vmap.pop_front();
			vmap.push_back(savestr);
		}
		return;
	}
		
	for (int i = 0; i < 8; ++i)
	{
		int cy = y + dy[i];
		int cx = x + dx[i];
		if (cx < 0 || cx >= 8 || cy < 0 || cy >= 8)
			continue;
		if (vmap[cy][cx] == '#')
			continue;
		dfs(cy, cx, cnt + 1);
	}
	dfs(y, x, cnt + 1);

	if (cnt >= 1)
	{
		vmap.pop_front();
		vmap.push_back(savestr);
	}
		
}


int main()
{
	for (int i = 0; i < 8; ++i)
	{
		string str;
		cin >> str;
		vmap.push_back(str);
	}

	dfs(7,0, 0);
	cout << ans;
	return 0;

}