๋ก๋ด ์ฒญ์๊ธฐ(๋ฌธ์ _ 14503)
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฒญ์ํ๋ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์ฅ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ์นธ์ ๋ฒฝ ๋๋ ๋น ์นธ์ด๋ค. ์ฒญ์๊ธฐ๋ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ, ์ด ๋ฐฉํฅ์ ๋, ์, ๋จ, ๋ถ์ค ํ๋์ด๋ค. ์ง๋์ ๊ฐ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๊ณ , r์ ๋ถ์ชฝ์ผ๋ก๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์, c๋ ์์ชฝ์ผ๋ก ๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์์ด๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ค.
- ํ์ฌ ์์น๋ฅผ ์ฒญ์ํ๋ค.
- ํ์ฌ ์์น์์ ํ์ฌ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๋ฐฉํฅ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์์ ์งํํ๋ค.
- ์ผ์ชฝ ๋ฐฉํฅ์ ์์ง ์ฒญ์ํ์ง ์์ ๊ณต๊ฐ์ด ์กด์ฌํ๋ค๋ฉด, ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๋ค์ ํ ์นธ์ ์ ์งํ๊ณ 1๋ฒ๋ถํฐ ์งํํ๋ค.
- ์ผ์ชฝ ๋ฐฉํฅ์ ์ฒญ์ํ ๊ณต๊ฐ์ด ์๋ค๋ฉด, ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ณ 2๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์๊ฐ ์ด๋ฏธ ๋์ด์๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ์๋, ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ๋ก ํ ์นธ ํ์ง์ ํ๊ณ 2๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์๊ฐ ์ด๋ฏธ ๋์ด์๊ฑฐ๋ ๋ฒฝ์ด๋ฉด์, ๋ค์ชฝ ๋ฐฉํฅ์ด ๋ฒฝ์ด๋ผ ํ์ง๋ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์๋์ ๋ฉ์ถ๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๋ ์ด๋ฏธ ์ฒญ์๋์ด์๋ ์นธ์ ๋ ์ฒญ์ํ์ง ์์ผ๋ฉฐ, ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.
์
๋ ฅ
์ฒซ์งธ ์ค์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (3 ≤ N, M ≤ 50)
๋์งธ ์ค์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ (r, c)์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ d๊ฐ ์ฃผ์ด์ง๋ค. d๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋ถ์ชฝ์, 1์ธ ๊ฒฝ์ฐ์๋ ๋์ชฝ์, 2์ธ ๊ฒฝ์ฐ์๋ ๋จ์ชฝ์, 3์ธ ๊ฒฝ์ฐ์๋ ์์ชฝ์ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฒ์ด๋ค.
์ ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ฅ์์ ์ํ๊ฐ ๋ถ์ชฝ๋ถํฐ ๋จ์ชฝ ์์๋๋ก, ๊ฐ ์ค์ ์์ชฝ๋ถํฐ ๋์ชฝ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋น ์นธ์ 0, ๋ฒฝ์ 1๋ก ์ฃผ์ด์ง๋ค. ์ง๋์ ์ฒซ ํ, ๋ง์ง๋ง ํ, ์ฒซ ์ด, ๋ง์ง๋ง ์ด์ ์๋ ๋ชจ๋ ์นธ์ ๋ฒฝ์ด๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ํ๋ ํญ์ ๋น ์นธ์ด๋ค.
์ถ๋ ฅ
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์ฒญ์ํ๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
3 3
1 1 0
1 1 1
1 0 1
1 1 1
answer : 1
ํ์ด
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
๋ก๋ด ์ฒญ์๊ธฐ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋๋ก ๊ตฌํํ๋ค.
//์ผ์ชฝ ๋ฐฉํฅ
const int ndx[] = { 0,-1,0,1 };
const int ndy[] = { -1,0,1,0 };
//ํ์ง ๋ฐฉํฅ
const int bdx[] = { 1,0,-1,0 };
const int bdy[] = { 0,-1,0,1 };
์ผ์ชฝ์ผ๋ก ํ์ ๊ณผ ํ์งํ๋ ๊ฒ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ๊ตฌํํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ก๋ด์ฒญ์๊ธฐ์ ์์น์ ๋ฐฉํฅ์ ์ ์ฅํ class๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ๋ค.
visited ๋ฐฐ์ด์ ์ด์ฉํด ํด๋น ์์น๋ฅผ ๋ก๋ด์ฒญ์๊ธฐ๊ฐ ์ฒญ์ํ์์ ์๋ณํ๋ค.
๊ทธ๋ฆฌ๊ณ bfs๋ฅผ ์ด์ฉํด ๋ก๋ด์ฒญ์๊ธฐ๋ฅผ ๋๋ ค์ฃผ์๋ค.
4 ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์ํ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด ํ์งํ๊ฑฐ๋ ์๋์ ๊ทธ๋ง๋๋๋ฐ ๊ทธ๊ฑด 4 ๋ฐฉํฅ์ ํ๋ํ๋ queue์ ๋ฃ๋ ๊ฒ ์๋๋ผ ์ฒ์๋ถํฐ ํ๋จํ๋ ์์ผ๋ก ๊ตฌํํ๋ค.
๋ก๋ด์ฒญ์๊ธฐ๊ฐ ์ผ์ชฝ์ผ๋ก ํ์ ํ์ ๋์ ์ขํ์ ํ์งํ์ ๋์ ์ขํ๋ง ์ ์ ์ฅํ๋ค๋ฉด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๊ฒ ํด๊ฒฐ ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
์ฝ๋
//๋ถ ๋ ๋จ ์
const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};
//์ผ์ชฝ ๋ฐฉํฅ
const int ndx[] = { 0,-1,0,1 };
const int ndy[] = { -1,0,1,0 };
//ํ์ง ๋ฐฉํฅ
const int bdx[] = { 1,0,-1,0 };
const int bdy[] = { 0,-1,0,1 };
class robot {
public:
int x, y, d;
robot(int x, int y, int d) {
this->x = x;
this->y = y;
this->d = d;
}
};
int main() {
int n, m;
cin >> n >> m;
// ๋ก๋ด์ฒญ์๊ธฐ์ ์นธ์ ์ขํ , ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ
int r, c, dd;
cin >> r >> c >> dd;
robot rb(r, c, dd);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
queue<robot> q;
visited[r][c] = true;
q.push(rb);
bool chk = true;
while (!q.empty()) {
if (!chk) break;
robot cur = q.front();
q.pop();
int cnt = 4;
for (int dir = 0; dir < 4; dir++) {
int nx = cur.x + dx[dir];
int ny = cur.y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
cnt--;
continue;
}
if (visited[nx][ny] || arr[nx][ny] == 1) cnt--;
}
if (cnt == 0) { // 4๋ฐฉํฅ ๋ชจ๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅ
cur.x = cur.x + bdx[cur.d];
cur.y = cur.y + bdy[cur.d];
if (arr[cur.x][cur.y] == 1) { // ํ์ง ๋ถ๊ฐ๋ฅ
chk = false;
break;
}
q.push(cur);
continue;
}
int nx = cur.x + ndx[cur.d];
int ny = cur.y + ndy[cur.d];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
// ์ฒญ์๊ฐ ๋์ด ์์ง ์๊ณ ๋ฒฝ์ด ์๋๊ฒฝ์ฐ
if (!visited[nx][ny] && arr[nx][ny] != 1) { // ์์ง ์ฒญ์๊ฐ ๋์ด ์์ง ์๋ค๋ฉด
// ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์
if (cur.d == 0) cur.d = 3;
else if (cur.d == 1) cur.d = 0;
else if (cur.d == 2) cur.d = 1;
else cur.d = 2;
// ์ ์ง ํ ์ฒญ์
visited[nx][ny] = true;
cur.x = nx;
cur.y = ny;
q.push(cur);
}
else { // ์ฒญ์ํ ๊ณต๊ฐ์ด ์๋ค๋ฉด
if (cur.d == 0) cur.d = 3;
else if (cur.d == 1) cur.d = 0;
else if (cur.d == 2) cur.d = 1;
else cur.d = 2;
q.push(cur);
}
}
// ๋ก๋ด์ฒญ์๊ธฐ๊ฐ ์ฒญ์ํ ๊ตฌ์ญ ์
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j]) cnt++;
}
}
cout << cnt;
}