반응형
728x170
문제대로 구현하면 된다.
하지만 어렵지는 않았다.
그냥.. 중간에 if 조건문에서 == 써야할 것을 =으로 써서 30분 날렸다.
https://www.acmicpc.net/problem/3190
# 맞는 풀이
#include <iostream>
#include <vector>
#include <queue>
#define X first
#define Y second
using namespace std;
//하 상 우 좌 -> 좌측 위 기준
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int N, K, L;
int map[100][100];
char direction[10001];
queue <pair<int, int>> q; //꼬리 잘라내기
//1.머리를 hx,hy로 옮김, 게임시간 cnt
int Move(int hx, int hy, int px, int py, int cnt) {
//종료조건 -> 몸에 부딪히거나 벽에 박으면 종료
if (hx < 0 || hx >= N || hy < 0 || hy >= N || map[hx][hy] == 1) {
return cnt;
}
//첫 노드는 확인하지 않음
if (cnt != 0) {
//2. 해당 칸에 사과가 있는지 없는지 확인
if (map[hx][hy] == 2) {
//사과가 있으면 먹고 1로 바꿈
q.push({ hx,hy });
map[hx][hy] = 1;
}
//사과가 없으면
else {
q.push({ hx,hy });
map[hx][hy] = 1;
auto tail = q.front();
q.pop();
map[tail.X][tail.Y] = 0; //꼬리는 0으로 바꿈.
}
}
else {
map[hx][hy] = 1;
}
//3.꼬리에 대한 처리 후 cnt를 높여야함.
//4. 다음 머리를 옮길 위치 지정
int dirX = hx - px;
int dirY = hy - py;
//머리를 옮김 -> 머리의 방향을 바꿔야할 경우
int nx, ny; //다음 갈 곳
nx = 0;
ny = 0;
//좌측으로 머리를 꺾음
if (direction[cnt] == 'L') {
//현재 방향이 아래쪽
if (dirX == dx[0] && dirY == dy[0]) {
nx = hx;
ny = hy + 1;
}//현재 방향이 위쪽
else if (dirX == dx[1] && dirY == dy[1]) {
nx = hx;
ny = hy - 1;
}//현재 방향이 오른
else if (dirX == dx[2] && dirY == dy[2]) {
nx = hx - 1;
ny = hy;
}//현재 방향이 왼
else if (dirX == dx[3] && dirY == dy[3]) {
nx = hx + 1;
ny = hy;
}
//cout << "머리 왼쪽으로 꺾음" << '\n';
}//머리를 오른쪽으로 꺾음
else if (direction[cnt] == 'D') {
//현재 방향이 아래쪽
if (dirX == dx[0] && dirY == dy[0]) {
nx = hx;
ny = hy - 1;
}//현재 방향이 위쪽
else if (dirX == dx[1] && dirY == dy[1]) {
nx = hx;
ny = hy + 1;
}//현재 방향이 오른
else if (dirX == dx[2] && dirY == dy[2]) {
nx = hx + 1;
ny = hy;
}//현재 방향이 왼
else if (dirX == dx[3] && dirY == dy[3]) {
nx = hx - 1;
ny = hy;
}
//cout << "머리 오른쪽으로 꺾음" << '\n';
}
//머리를 꺾지 않음
else{
nx = hx + dirX;
ny = hy + dirY;
}
/* -> 진행상황 프린트 함수
* for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << map[i][j];
}
cout << '\n';
}
cout << "///////////////////////////////////" << '\n';
*/
return Move(nx, ny, hx, hy, cnt + 1);
}
int main() {
cin >> N >> K;
while (K--) {
int x, y;
cin >> x >> y;
map[x - 1][y - 1] = 2;
}
cin >> L;
while (L--) {
int x;
char c;
cin >> x >> c;
direction[x] = c;
}
q.push({ 0,0 });
int ans = Move(0, 0, 0, -1, 0); //처음엔 오른쪽으로 시작함.
cout << ans;
}
if 조건문에는 =가 들어가는 것을 경계하라..
30분 날렸다.
728x90
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
백준, BOJ, 21608번, 상어초등학교: C++ [CPP] (0) | 2021.12.08 |
---|---|
백준, BOJ, 20055번, 컨베이어 벨트 위의 로봇 : C++ [CPP] (0) | 2021.12.08 |
백준, BOJ, 1707번, 이분 그래프 : C++ [CPP] ★ (0) | 2021.12.07 |
백준, BOJ, 1753번, 최단경로 : C++ [CPP] ★★★★★ (0) | 2021.12.07 |
백준, BOJ, 16637번, 괄호추가하기 : C++ [CPP] (0) | 2021.12.06 |