3190 swift / c++ - 뱀

2024. 9. 23. 03:16카테고리 없음

뱀 게임 구현

c++

/* ************************************************************************** */
/*                                                                            */
/*                                                      :::    :::    :::     */
/*   Problem Number: 3190                              :+:    :+:      :+:    */
/*                                                    +:+    +:+        +:+   */
/*   By: chanhihi <boj.kr/u/chanhihi>                +#+    +#+          +#+  */
/*                                                  +#+      +#+        +#+   */
/*   https://boj.kr/3190                           #+#        #+#      #+#    */
/*   Solved: 2024/09/23 02:08:59 by chanhihi      ###          ###   ##.kr    */
/*                                                                            */
/* ************************************************************************** */

#include <bits/stdc++.h>

using namespace std;

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

int main() {
  int n, k, l;
  cin >> n >> k;

  vector<vector<int>> board(n, vector<int>(n));
  char list[10000] = {0};

  for (int i = 0; i < k; i++) {
    int y, x;
    cin >> y >> x;
    board[y - 1][x - 1] = 1;
  }

  cin >> l;
  for (int i = 0; i < l; i++) {
    int x;
    char c;
    cin >> x >> c;
    list[x] = c;
  }

  deque<pair<int, int>> snake;

  int nx = 0, ny = 0;
  int dir = 0, sec = 0;
  snake.push_back({0, 0});

  while (nx >= 0 && nx < n && ny >= 0 && ny < n) {
    if (list[sec] == 'D') {
      dir = (dir + 1) % 4;
    } else if (list[sec] == 'L') {
      dir = (dir + 3) % 4;
    }

    nx += dx[dir];
    ny += dy[dir];

    auto it = find(snake.begin(), snake.end(), pair<int, int>{nx, ny});

    if (nx < 0 || ny < 0 || nx >= n || ny >= n || it != snake.end()) {
      break;
    }

    if (!board[ny][nx]) {
      snake.pop_back();
    } else {
      board[ny][nx] = 0;
    }
    snake.push_front({nx, ny});

    sec++;
  }

  cout << sec + 1;

  return 0;
}

 

swift

import Foundation

let dx = [1, 0, -1, 0]
let dy = [0, 1, 0, -1]

let n = Int(readLine()!)!
let k = Int(readLine()!)!

var board = Array(repeating: Array(repeating: 0, count: n), count: n)
var directionChanges = [Int: String]()

for _ in 0..<k {
    let input = readLine()!.split(separator: " ").map { Int($0)! }
    let y = input[0] - 1
    let x = input[1] - 1
    board[y][x] = 1
}

let l = Int(readLine()!)!
for _ in 0..<l {
    let input = readLine()!.split(separator: " ")
    let time = Int(input[0])!
    let dir = String(input[1])
    directionChanges[time] = dir
}

var snake = [(0, 0)]
var dir = 0, sec = 0, nx = 0, ny = 0

while true {
    sec += 1
    nx += dx[dir]
    ny += dy[dir]
    
    if nx < 0 || ny < 0 || nx >= n || ny >= n || snake.contains(where: { $0 == (nx, ny) }) {
        break
    }

    if board[ny][nx] == 0 {
        snake.removeLast()
    } else {
        board[ny][nx] = 0
    }

    snake.insert((nx, ny), at: 0)

    if let newDir = directionChanges[sec] {
        if newDir == "D" {
            dir = (dir + 1) % 4 
        } else if newDir == "L" {
            dir = (dir + 3) % 4
        }
    }
}

print(sec)