문제 링크: https://www.acmicpc.net/problem/3190

 

구글에 스네이크 게임을 검색하면 게임을 할 수 있다

뱀 게임이라고 아실겁니다. 되게 고전 게임인데 이 문제는 그 게임을 구현하는 문제입니다.

저는 군대 특기학교 있을때 자바스크립트로 이 게임 만들어서 하고 그랬습니다.. 암튼 원리는 다들 아실 겁니다.

 

금방 풀 줄 알았는데 여러번 틀렸습니다;;;

처음에 틀린 이유는 사과를 먹었을 때 없어지게 하지 않아서 틀렸고요, 두 번째는 좌회전, 우회전 구현을 좀 잘못해놓은 실수가 있었네요.

알고리즘적으로 어려운것은 전혀 없는 그냥 구현 문제입니다

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;


// 시계방향
enum DIRECTION {
  RIGHT,
  DOWN,
  LEFT,
  UP
};

enum MAP {
  EMPTY,
  APPLE,
  //SNAKE
};

const int dir[][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };  //y, x

int arr[100][100];
int current_direction = DIRECTION::RIGHT;
int elapsed = 0;
bool endflag = false;

int main(int argc, char** argv)
{
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
#endif

  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n, k, l;
  cin >> n >> k;

  int a, b;
  for (int i = 0; i < k; ++i) {
    cin >> a >> b;
    arr[a - 1][b - 1] = MAP::APPLE;
  }

  cin >> l;
  vector<pair<int, bool>> turns;  //sec, is_clockwise
  turns.reserve(l);
  char c;
  for (int i = 0; i < l; ++i) {
    cin >> a >> c;
    turns.push_back(make_pair(a, c=='D'));
  }

  deque<pair<int, int>> snake;  //front 머리 back 꼬리, y, x
  snake.push_back(make_pair(0, 0));

  while (true) {
    if (endflag) break;
    
    ++elapsed;


    // move
    pair<int, int> next_move = snake.front();
    next_move.first += dir[current_direction][0];
    next_move.second += dir[current_direction][1];
    snake.push_front(next_move);

    // wall?
    if (!(next_move.first >= 0 && next_move.first < n && next_move.second >= 0 && next_move.second < n)) {
      break;
    }

    // snake body check
    for (int i = 1; i < snake.size(); ++i) {
      if (snake[i] == next_move) {
        endflag = true;
        break;
      }
    }

    // empty
    if (arr[next_move.first][next_move.second] != MAP::APPLE) {
      snake.pop_back();
    }
    else {
      // 사과 먹은거 처리
      arr[next_move.first][next_move.second] = MAP::EMPTY;
    }
    
    // turn
    for (auto& t : turns) {
      if (t.first == elapsed) {
        if (t.second)
          current_direction = (current_direction + 1) % 4;
        else
          current_direction = (current_direction == 0 ? 3 : current_direction - 1);
      }
    }
  }

  cout << elapsed;


  return 0;
}

 

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 15685: 드래곤 커브  (0) 2020.03.28
[백준][C++] 14500: 테트로미노  (0) 2020.03.26
[백준][C++] 2615: 오목  (2) 2020.03.26
[백준][C++] 1939: 중량제한  (0) 2020.03.26
[백준][C++] 2312: 수 복원하기  (0) 2019.08.22