이 문제를 푸는데 필요한 개념은 BFS와 DFS 인 것 같다.
아이디어는 각 칸에 4개의 방향에 대해서 연결이 되어있으면 1로 저장한다.
ex ) +의 경우 -> {1,1,1,1}
-의 경우 -> {0,1,0,1}
1의 경우 -> {0,1,1,0}
이 후 bfs를 통해 탐색하는데 1로 되어있음에도 그 다음 칸이 0으로 되어있다면
그 칸이 바로 지워진 칸이 된다.
지워진 칸을 찾은 뒤 그 칸에 4방향에서 연결된 가스관의 위치를 확인하여
정답을 출력해 주면 된다.
...코드가 좀 지저분 한거 같다..
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 205
#define INF 987654321
#define MOD 1000000
typedef long long ll;
#pragma warning(disable:4996)
using namespace std;
int n, m, cy, cx, dy[4] = { -1,0,1,0 }, dx[4] = { 0,1,0,-1 }, u[4] = { 2,3,0,1 };
char c, map[30][30], str[7] = { 124,'-','+','1','2','3','4' };
bool tf[7][4] = { { 1,0,1,0 },{ 0,1,0,1 },{ 1,1,1,1 },{ 0,1,1,0 },{ 1,1,0,0 },{ 1,0,0,1 },{ 0,0,1,1 } };
bool visit[30][30], mem[4][30][30];
pair<int, int> p[2];
queue<pair<int, int>> q;
void bfs()
{
while (!q.empty())
{
pair<int, int> tmp = q.front();
q.pop();
for (int i = 0; i<4; i++)
{
int ty = tmp.first + dy[i], tx = tmp.second + dx[i];
if (visit[ty][tx] == false)
{
if (mem[i][tmp.first][tmp.second] && mem[u[i]][ty][tx])
{
visit[ty][tx] = true;
q.push(make_pair(ty, tx));
}
else if (mem[i][tmp.first][tmp.second] || mem[u[i]][ty][tx])
{
printf("%d %d ", ty, tx);
bool ans[4];
for (int k = 0; k<4; k++)
{
int ry = ty + dy[k], rx = tx + dx[k];
if (mem[u[k]][ry][rx])
ans[k] = true;
else
ans[k] = false;
}
for (int p = 0; p<7; p++)
for (int q = 0; q<4; q++)
{
if (ans[q] != tf[p][q])
break;
if (q == 3)
{
printf("%c", str[p]);
return;
}
}
}
}
}
}
}
int main()
{
fill_n(&mem[0][0][0], 4 * 30 * 30, 0);
fill_n(&map[0][0], 30 * 30, '.');
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
getchar();
for (int k = 1; k <= m; k++)
{
scanf("%c", &c);
map[i][k] = c;
if (c == 'M')
p[0].first = i, p[0].second = k;
else if (c == 'Z')
p[1].first = i, p[1].second = k;
for (int p = 0; p<7; p++)
if (c == str[p])
for (int q = 0; q<4; q++)
mem[q][i][k] = tf[p][q];
}
}
for (int i = 0; i<2; i++)
{
for (int k = 0; k<4; k++)
{
int ty = p[i].first + dy[k], tx = p[i].second + dx[k];
if (mem[u[k]][ty][tx])
mem[k][p[i].first][p[i].second] = true;
}
}
visit[p[0].first][p[0].second] = true;
q.push(make_pair(p[0].first, p[0].second));
bfs();
return 0;
}
'IT > BOJ' 카테고리의 다른 글
| 백준(BOJ) 4096 팰린드로미터 ** (0) | 2018.06.01 |
|---|---|
| 백준(BOJ) 14502번 연구소 * (0) | 2018.06.01 |
| 백준(BOJ) 1865 웜홀 ** (0) | 2018.06.01 |
| 백준(BOJ) 11779 최소비용 구하기 2 ** (0) | 2018.06.01 |
| 백준(BOJ) 1261 알고스팟 2 ** (0) | 2018.06.01 |