<C/C++> BOJ 13460: ๊ตฌ์ฌํ์ถ
์ค๋๋ถํฐ ํ๋ฃจ์ ํ๋๋ฌธ์ ์ฉ ๊ฐ๋ณ์ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ค๊ณ ํฉ๋๋ค!
#include <stdio.h>
#include <queue>
using namespace std;
#define MAXN 10
int N, M;
int RR, RC, BR, BC;
int rcnt, bcnt;
char map[MAXN + 5][MAXN + 5];
int visited[MAXN + 5][MAXN + 5][MAXN + 5][MAXN + 5];
struct DATA { int rr, rc, br, bc, t; };
queue<DATA> q;
static int dr[] = { -1, 1, 0, 0 };
static int dc[] = { 0, 0, -1, 1 };
void tilt(int &r, int &c, int &cnt, int i) {
for (;;) {
if (map[r][c] == 'O') break;
if (map[r + dr[i]][c + dc[i]] == '#')break;
r += dr[i];
c += dc[i];
cnt++;
}
//printf("%d %d %d\n", r, c, cnt);
}
int BFS(void) { // ๋ฌธ์ ๊ผผ๊ผผํ ์ฝ๊ธฐ
q = {};
q.push({ RR, RC, BR, BC, 0 });
visited[RR][RC][BR][BC] = 1;
while (!q.empty()) {
DATA cur = q.front(); q.pop();
if (cur.t >= 10) break; //10ํ ์ด๊ณผ
for (int i = 0; i < 4; i++) {
int nrr = cur.rr, nrc = cur.rc, nbr = cur.br, nbc = cur.bc;
rcnt = 0, bcnt = 0;
tilt(nrr, nrc, rcnt, i);
tilt(nbr, nbc, bcnt, i);
//printf("%d %d %d: %d %d %d %d // %d %d %d %d \n", cur.t, rcnt, bcnt, cur.rr, cur.rc, cur.br, cur.bc, nrr, nrc, nbr, nbc);
if (map[nbr][nbc] == 'O') continue; // ํ๋๊ตฌ์ฌ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ
if (map[nrr][nrc] == 'O') return cur.t + 1; // ๋นจ๊ฐ๊ตฌ์ฌ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ
if (nrr == nbr && nrc == nbc) { // ๊ฒน์น๋ฉด ๋๋ง์ด ์์ง์ธ ๊ตฌ์ฌ ํ์นธ ์ด์ ์ผ๋ก ๋ณด๋ด์ฃผ๊ธฐ
if (rcnt > bcnt) nrr -= dr[i], nrc -= dc[i];
else nbr -= dr[i], nbc -= dc[i];
}
if (visited[nrr][nrc][nbr][nbc]) continue; // ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฉด
visited[nrr][nrc][nbr][nbc] = 1;
q.push({ nrr, nrc, nbr, nbc, cur.t + 1 });
}
}
return -1;
}
void Solve(void) {
for (int i = 2; i < N; i++) {
for (int j = 2; j < M; j++) {
if (map[i][j] == 'R') {
RR = i, RC = j;
}
else if (map[i][j] == 'B') {
BR = i, BC = j;
}
}
}
int ans = BFS();
printf("%d\n", ans);
}
void InputData(void) {
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++) {
scanf("%s", &map[i][1]); // '&' ๊ผญ ๋ถ์ด๊ธฐ
}
}
int main(void) {
InputData();
Solve();
return 0;
}
<What I learned>
๋ฌธ์ ๊ผผ๊ผผํ ์ฝ์...
์ด์ ์ ํ์๋ ๋ฌธ์ (๊ตฌ์ฌ ์ง์ด๋ฃ๊ธฐ)์ ๊ฑฐ์ ๋์ผํด์ ๋ฌธ์ ๋ฅผ ๋์ถฉ ์ฝ์๋ค.
ํ์นธ์ฉ ์์ง์ธ๋ค ์๊ฐํ๊ณ ํ์๋ค.
ํ์ง๋ง ํ๋ฒ ์์ง์ด๋ฉด ๋ชป์์ง์ผ ๋๊น์ง(๋ฒฝ์ ๋ถ๋ชํ๊ฑฐ๋ ๊ตฌ์ฌ์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ) ๊ณ์ ์์ง์ด๋ ๊ฒ์ด๊ธฐ์
๋ฐฉํฅ ๊ฒฐ์ ํด์ฃผ๋ for๋ฌธ ์์ while๋ฌธ์ ์ฌ์ฉํด์ ๋๊น์ง ์์ง์ฌ์ค์ผ ํ๋ค.
๊ตฌ์ฌ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ์ ๋ ํ ๊ตฌ์ฌ์ ์ด์ ์ ์๋ฆฌ๋ก ์ฎ๊ฒจ์ค์ผ ํ๋๋ฐ
๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ ๊ฐ๊ฐ cnt๋ฅผ ๋น๊ตํด์ ๋ ํฐ ๊ฑธ ์ด์ ์๋ฆฌ๋ก ์ฎ๊ฒจ์ค๋ค.
์ด์ ํ์๋ ๋ฌธ์ ์ ๋ฌ๋ฆฌ ์ ํจ์ฑ ๊ฒ์ฌ ์์๋ ์ค์
๊ฒน์ณค์ ๊ฒฝ์ฐ ๊ทธ์ ๋ง๊ฒ ๋ฐ๊ฟ์ค ํ ์ ํจ์ฑ ๊ฒ์ฌํ๊ธฐ