-
[백준 17837] 새로운 게임 2C 프로그래밍/BOJ 2022. 10. 10. 15:31728x90
https://www.acmicpc.net/problem/17837
#include <cstdio> #include <vector> #include <algorithm> int N, K; int board[12 + 2][12 + 2]; std::vector<int> Chess[12 + 2][12 + 2]; // 말 쌓아놓음 struct _ht { int idx; // 벡터의 몇번째 위치에 있는지 int x, y; int dir; }; _ht Horse[10 + 2]; void input() { scanf("%d %d", &N, &K); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &board[i][j]); } } for (int i = 1; i <= K; i++) { int r = 0, c = 0, d = 0; scanf("%d %d %d", &r, &c, &d); Horse[i] = { 0, r, c, d }; Chess[r][c].push_back(i); } } void make_bound() { for (int n = 0; n <= N + 1; n++) { board[n][N + 1] = 2; board[n][0] = 2; board[N + 1][n] = 2; board[0][n] = 2; } } bool play_game() { // →, ←, ↑, ↓ static int dir_x[5] = { 0, 0, 0, -1, 1 }; static int dir_y[5] = { 0, 1, -1, 0, 0 }; static int dir_op[5] = { 0, 2, 1, 4, 3 }; for (int h = 1; h <= K; h++) { bool set = false; bool blue = false; for (int d = 0; d <= 1; d++) { if (set == true) break; int idx = Horse[h].idx; int x = Horse[h].x; int y = Horse[h].y; int dir = Horse[h].dir; int nx = x + dir_x[dir]; int ny = y + dir_y[dir]; int size = Chess[x][y].size(); // 흰색 if (board[nx][ny] == 0) { int moved = 0; for (int i = idx; i < size; i++) { int horse = Chess[x][y][i]; Chess[nx][ny].push_back(horse); int nidx = Chess[nx][ny].size() - 1; Horse[horse] = { nidx, nx , ny, Horse[horse].dir }; moved++; } for (int i = 0; i < moved; i++) { Chess[x][y].pop_back(); } set = true; if (Chess[nx][ny].size() >= 4) return true; } // 빨간색 else if (board[nx][ny] == 1) { for (int i = size - 1; i >= idx; i--) { int horse = Chess[x][y][Chess[x][y].size() - 1]; Chess[nx][ny].push_back(horse); int nidx = Chess[nx][ny].size() - 1; Horse[horse] = { nidx, nx , ny, Horse[horse].dir }; Chess[x][y].pop_back(); } set = true; if (Chess[nx][ny].size() >= 4) return true; } // 파란색 혹은 외부영역 else if (board[nx][ny] == 2) { if (blue == false) { int ndir = dir_op[dir]; Horse[h] = { idx , x , y, ndir }; blue = true; } else { Horse[h] = { idx , x , y, dir }; break; } } } } return false; } int simulation() { for (int turn = 1; turn <= 1000; turn++) { //debug_h(); if (play_game()) return turn; } return -1; } int main() { input(); make_bound(); int ans = simulation(); printf("%d\n", ans); return 0; }
1. 외부 영역을 파란색 칸으로 만들어서 흰색 / 빨간색 / 파란색 칸을 만났을 때 세 가지 케이스만 판단하도록 구현했다.
2. 파란색 칸을 만나면 다시 탐색을 진행해야 하는데, 이 부분을 재귀로 구현해도 되지만 나는 그냥 쉽게 for 루프 두 번 돌렸다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 20057] 마법사 상어와 토네이도 (0) 2022.10.10 [백준 20056] 마법사 상어와 파이어볼 (0) 2022.10.10 [백준 19237] 어른 상어 (0) 2022.10.10 [백준 1726] 로봇 (0) 2022.10.10 [백준 17143] 낚시왕 (0) 2022.10.06