[백준] 3190 뱀
업데이트:
백준 3190 뱀 문제 풀이입니다.
이 문제는 주어진 조건대로 뱀 길이를 늘리고 줄이고 하면 되는 문제였습니다. 따라서 dfs를 쓰든 bfs를 쓰든 상관은 없습니다.
전 그중 bfs를 사용하였고, 뱀의 길이는 deque로 표현하였습니다.
이후 방향 변환 정보는 vector를 사용해서 쭉 저장한 다음에 매 이동 횟수와 정보를 비교하여 일치한다면 방향 위치를 변환시켜주는 것으로 구현을 하였습니다.
소스코드는 다음과 같습니다.
Source Code:
```cpp
#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 101
typedef pair<int, int> p;
int Map[MAX][MAX];
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int N, K, L;
vector<pair<int,char>> Rotate_info;
deque<p> q;
bool visit[MAX][MAX] = { false, };
int main() {
cin >> N >> K;
for (int i = 0; i < K; i++) {
int x, y;
cin >> x >> y;
Map[x][y] = 1;
}
cin >> L;
for (int i = 0; i < L; i++) {
int second;
char dir;
cin >> second >> dir;
Rotate_info.push_back({ second,dir });
}
q.push_back({ 1,1 });
int cur = 0;
int result = 0;
int dir = 1;
while (!q.empty()) {
result++;
p tmp = q.back();
int x = tmp.first;
int y = tmp.second;
int nx = x + dx[dir];
int ny = y + dy[dir];
if (visit[nx][ny] || nx < 1 || nx > N || ny < 1 || ny > N)break;
visit[nx][ny] = true;
q.push_back({ nx,ny });
if (Map[nx][ny] == 1)
Map[nx][ny] = 0;
else {
p ttmp = q.front();
q.pop_front();
visit[ttmp.first][ttmp.second] = false;
}
if (cur < L && result == Rotate_info[cur].first) {
if (Rotate_info[cur++].second == 'D') {
dir = (dir + 1 + 4) % 4;
}
else {
dir = (dir - 1 + 4) % 4;
}
}
}
cout << result;
return 0;
}
```
궁금하신 점은 댓글 남겨 주세요!!
Summary
- 되도록이면 푼 문제들 계속 올리도록 하겠습니다…
- 또 간혹 설명이 이해가 안간다면 말해주시면 그림까지 같이 넣는 노력을 하겠습니다. 감사합니다.
댓글남기기