๋ฌธ์
๊ฑฐ์ธ์ ์ค์นํ๋ฉด ๋ฐฉํฅ์ 90๋ ํ์ ์ํฌ ์ ์๋ค.
*์ ๋ฒฝ์ผ๋ก ๋ซ๊ณ ์ง๋๊ฐ ์ ์๋ค.
๊ฑฐ์ธ์ ์ต์๋ก ์ค์นํ์ฌ์ ์ฒ์ ์์์ง์ C์์ ๋์ง์ C์ ๋๋ฌํ ๋๊น์ง ๊ฐ์ผํ๋ค.
์ต์๋ก ์ค์นํ ์ ์๋ ๊ฑฐ์ธ ์๋ฅผ ์ถ๋ ฅํ๋ผ
์ ๋ ฅ 1
7 8
.......
......C
......*
*****.*
....*..
....*..
.C..*..
.......
์ถ๋ ฅ 1
3
์ฝ๋
#include<iostream>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>
using namespace std;
//6087๋ฒ ๋ ์ด์ ํต์
char MAP[101][101];
int visited[101][101];
int w, h;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
pair<int, int> startP, endP;
queue<pair<int,int>> cntDir;
queue < pair<int, int>> Q;
void BFS() {
for (int i = 0; i < 4; i++) {
Q.push(make_pair(startP.first, startP.second));
cntDir.push(make_pair(0, i));
}
visited[startP.first][startP.second] = 0;
while (Q.empty() == 0) {
int y = Q.front().first;
int x = Q.front().second;
int cnt = cntDir.front().first;
int dir = cntDir.front().second;
Q.pop();
cntDir.pop();
//์ข์ฐ์์๋ ํ์
for (int i = 0; i < 4; i++) {
int ny = y + arrow[i][0];
int nx = x + arrow[i][1];
int nCnt = cnt;
if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
if (MAP[ny][nx] == '*') continue;
if (dir != i) nCnt++;
if (visited[ny][nx] >= nCnt) {
visited[ny][nx] = nCnt;
Q.push(make_pair(ny, nx));
cntDir.push(make_pair(nCnt, i));
}
}
}
cout << visited[endP.first][endP.second];
}
void input() {
bool isFirst = true;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> MAP[i][j];
if (MAP[i][j] == 'C') {
(isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
isFirst = false;
}
visited[i][j] = 10001;
}
}
}
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
cin >> w >> h;
input();
BFS();
return 0;
}
*๊ฐ๋จํ ํด์ค*
void input() {
bool isFirst = true;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> MAP[i][j];
if (MAP[i][j] == 'C') {
(isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
isFirst = false;
}
visited[i][j] = 10001;
}
}
}
๋จผ์ input ํจ์์์ cin์ ํตํด MAP์ ๋ฐ์์ต๋๋ค.
๊ทธ ์ค ๋ง์ฝ C๊ฐ ์ ๋ ฅ๋์๋ค๋ฉด ์ฒ์์ธ์ง ์๋์ง๋ฅผ ํ๋จํด์ ์ฒ์์ด๋ผ๋ฉด startP์ ํด๋น ์์น๋ฅผ ๋ฃ๊ณ , ์ฒ์์ด ์๋๋ผ๋ฉด endP์ ํด๋น ์์น๋ฅผ ๋ฃ๋๋ค.
void BFS() {
for (int i = 0; i < 4; i++) {
Q.push(make_pair(startP.first, startP.second));
cntDir.push(make_pair(0, i));
}
visited[startP.first][startP.second] = 0;
while (Q.empty() == 0) {
int y = Q.front().first;
int x = Q.front().second;
int cnt = cntDir.front().first;
int dir = cntDir.front().second;
Q.pop();
cntDir.pop();
//์ข์ฐ์์๋ ํ์
for (int i = 0; i < 4; i++) {
int ny = y + arrow[i][0];
int nx = x + arrow[i][1];
int nCnt = cnt;
if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
if (MAP[ny][nx] == '*') continue;
if (dir != i) nCnt++;
if (visited[ny][nx] >= nCnt) {
visited[ny][nx] = nCnt;
Q.push(make_pair(ny, nx));
cntDir.push(make_pair(nCnt, i));
}
}
}
cout << visited[endP.first][endP.second];
}
ํ์์ ์์ํ ์์น์ธ startP์ ์์น๋ฅผ 4๋ฒ Q์ ์ฎ๊ฒจ๋ด์ต๋๋ค. ์์ ์์น์์ ์,์๋,์ผ์ชฝ,์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ ํ์ํ๋ ๋ฐฉํฅ์ ์ ์ฅํด์ค๋๋ค. ๋ฐฉํฅ์ด ๋ค๋ฅด๋ค๋ฉด ๊ฑฐ์ธ์ ๊ฐฏ์๋ฅผ ๋ํด์ค์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ ๋ค์ Q๊ฐ ๋น๋๊น์ง while๋ฌธ์ ๋๋ฆฝ๋๋ค. Q์ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๋ณ์์ ๋ด๊ณ ์ข์ฐ์์๋ ํ์์ ์์ํฉ๋๋ค. ํ์์์ *์ธ ๋ฒฝ์ ๋ง๋๊ฑฐ๋ ๋งต์ ๋ฒ์ด๋๋ฉด ํ์์ ๊ฑด๋๋ฐ๊ณ , ๋ง์ฝ ๊ฐ๋ ๋ฐฉํฅ๊ณผ ํ์ฌ ๋ฐฉํฅ์ด ๋ง์ง ์๋ค๋ฉด ๊ฑฐ์ธ์ ๋ํด์ค๋๋ค. ํ์ฌ ๋ฐฉ๋ฌธํ ์์น์์์ ๊ฑฐ์ธ์ ์ฌ์ฉํ ๊ฐฏ์๋ฅผ visited[][] ๋ฐฐ์ด์ ์ ์ฅํ๊ธฐ์ ๋ง์ฝ ์ฌ์ฉํ ๊ฐฏ์๊ฐ ํ์ฌ ์นด์ดํธ๋ณด๋ค ๋๋ค๋ฉด ์ต์๋ก ์ฌ์ฉํด์ผํ๊ธฐ๋๋ฌธ์ ๋ณ๊ฒฝํด์ค๋๋ค. ์ด๊ฒ์ ๋์ง์ ์ ๋๋ฌํ ๋๊น์ง ๊ณ์ ๋ฐ๋ณตํ์ฌ์ visited[๋์ง์ .y][๋์ง์ .x] ์ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋ต์ด ๋ฉ๋๋ค.
*์ด ๋ฐฉ๋ฒ๋ง์ด ๋ง๋ ์ ๋ต์ ์๋๋๋ค.
ํจ์ฌ ์ข๊ณ ๋น ๋ฅธ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถํ์๋ ๋ถ๋ค ํ์ดํ ! '0'/*
'์๊ณ ๋ฆฌ์ฆ > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] BOJ 2178๋ฒ: ๋ฏธ๋ก ํ์ (0) | 2022.07.05 |
---|---|
[C++] BOJ 2749๋ฒ: ํผ๋ณด๋์น ์ 3 (0) | 2022.06.20 |
[C++] BOJ 2244๋ฒ: ๋ฏผ์ฝ์ฐ์คํค ํฉ (0) | 2022.06.13 |
[C++] BOJ 2933๋ฒ: ๋ฏธ๋ค๋ (0) | 2022.06.13 |
[C++] BOJ 1655๋ฒ: ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2022.06.08 |