-
[백준 16509] 장군C 프로그래밍/BOJ 2022. 11. 3. 17:29728x90
https://www.acmicpc.net/problem/16509
16509번: 장군
오랜만에 휴가를 나온 호근이는 문득 동아리방에 있는 장기가 하고 싶어졌다. 하지만 장기를 오랫동안 하지 않은 탓인지 예전에는 잘 쓰던 상을 제대로 쓰는 것이 너무 힘들었다. 호근이를 위해
www.acmicpc.net
#include <cstdio> #include <queue> #include <cstring> int sr, sc; int kr, kc; int board[10 + 2][10 + 2]; struct _st { int x, y; }; std::queue<_st> Q; int visited[10 + 2][10 + 2]; void debug() { for (int i = 0; i <= 9; i++) { for (int j = 0; j <= 8; j++) { printf("%3d", visited[i][j]); } printf("\n"); } } void input() { scanf("%d %d", &sr, &sc); scanf("%d %d", &kr, &kc); } int BFS() { // 상 하 좌 우 int dir_x[4] = { -1, 1, 0, 0 }; int dir_y[4] = { 0, 0 , -1, 1 }; int move[4][2][2] = { {{-2, -2}, {-2, 2}}, {{ 2, -2}, {2, 2}}, {{-2, -2}, {2, -2}}, {{-2, 2}, {2, 2}} }; int chk[4][2][2] = { {{-1, -1}, {-1, 1}}, {{1, -1}, {1, 1}}, {{-1, -1}, {1, -1}}, {{-1, 1}, {1, 1}}}; memset(visited, -1, sizeof(visited)); Q.push({ sr, sc }); visited[sr][sc] = 0; while (!Q.empty()) { _st data = Q.front(); Q.pop(); if (data.x == kr && data.y == kc) return visited[kr][kc]; for (int p = 0; p < 4; p++) { int nx = data.x + dir_x[p]; int ny = data.y + dir_y[p]; if (nx < 0 || nx > 9 || ny < 0 || ny > 8) continue; for (int d = 0; d < 2; d++) { int dx = nx + move[p][d][0]; int dy = ny + move[p][d][1]; if (dx < 0 || dx > 9 || dy < 0 || dy > 8) continue; if (nx + chk[p][d][0] == kr && ny + chk[p][d][1] == kc) continue; if (visited[dx][dy] >= 0) continue; Q.push({ dx, dy }); visited[dx][dy] = visited[data.x][data.y] + 1; } } } return -1; } int main() { input(); int ans = BFS(); printf("%d\n", ans); return 0; }
가는 길에 기물 있는지 신경써주기 !
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 1400] 화물차 (0) 2022.11.03 [백준 24513] 좀비 바이러스 (0) 2022.11.03 [백준 16985] Maaaaaaaaaze (0) 2022.11.02 [백준 11567] 선진이의 겨울 왕국 (0) 2022.11.02 [백준 9328] 열쇠 (1) 2022.11.01