๋ฌธ์
์ฑ์์ด๋ ๊ฑฐ์ธ์ ๋ค์ฌ๋ค๋ณด๋ ๊ฒ์ ์ฐธ ์ข์ํ๋ค. ๊ทธ๋์ ์ง ๊ณณ๊ณณ์ ๊ฑฐ์ธ์ ์ค์นํด๋๊ณ ์ง ์์ ๋์๋ค๋ ๋๋ง๋ค ๊ฑฐ์ธ์ ๋ณด๊ณค ํ๋ค.
์ฑ์์ด๋ ์ ํด๋ฅผ ๋ง์ดํ์ฌ ์ด์ฌ๋ฅผ ํ๊ฒ ๋์๋๋ฐ, ๊ฑฐ์ธ์ ์ข์ํ๋ ๊ทธ๋ ์ ์ฑ๊ฒฉ ๋๋ฌธ์ ์ ์ง์๋ ๊ฑฐ์ธ์ ๋งค๋ฌ๋งํ ์์น๊ฐ ์ฌ๋ฌ ๊ณณ ์๋ค. ๋ํ ์ฑ์์ด๋ค ์ ์ง์๋ ๋ฌธ์ด ๋ ๊ฐ ์๋๋ฐ, ์ฑ์์ด๋ ๊ฑฐ์ธ์ ์ ์ค์นํ์ฌ ์ฅ๋์ ์น๊ณ ์ถ์ด์ก๋ค. ์ฆ, ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋๋ก ๊ฑฐ์ธ์ ์ค์นํ๊ณ ์ถ์ด์ก๋ค.
์ฑ์์ด๋ค ์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ค์นํด์ผ ํ๋ ๊ฑฐ์ธ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๊ฑฐ์ธ์ ์ค์นํ ๋์๋ 45๋ ๊ธฐ์ธ์ด์ง ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ค์นํด์ผ ํ๋ค. ๋ํ ๋ชจ๋ ๊ฑฐ์ธ์ ์๋ฉด ๊ฑฐ์ธ์ด๊ธฐ ๋๋ฌธ์ ์ ์ชฝ ๋ชจ๋์์ ๋ฐ์ฌ๊ฐ ์ผ์ด๋ ์ ์๋ค. ์ฑ์์ด๋ ๊ฑฐ์ธ์ ๋งค์ฐ ๋ง์ด ๊ฐ์ง๊ณ ์์ด์ ๊ฑฐ์ธ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ์.
๊ฑฐ์ธ์ ์ด๋ป๊ฒ ์ค์นํด๋ ํ ์ชฝ ๋ฌธ์์ ๋ค๋ฅธ ์ชฝ ๋ฌธ์ ๋ณผ ์ ์๋ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง์ง ์๋๋ค.
์ฒซ์งธ ์ค์ ์ง์ ํฌ๊ธฐ N (2 ≤ N ≤ 50)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ N๊ฐ์ ๋ฌธ์๋ก ์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ‘#’๋ ๋ฌธ์ด ์ค์น๋ ๊ณณ์ผ๋ก ํญ์ ๋ ๊ณณ์ด๋ฉฐ, ‘.’์ ์๋ฌด ๊ฒ๋ ์๋ ๊ฒ์ผ๋ก ๋น์ ์ด ๊ณณ์ ํต๊ณผํ๋ค. ‘!’์ ๊ฑฐ์ธ์ ์ค์นํ ์ ์๋ ์์น๋ฅผ ๋ํ๋ด๊ณ , ‘*’์ ๋น์ด ํต๊ณผํ ์ ์๋ ๋ฒฝ์ ๋ํ๋ธ๋ค.
ํ์ด
๋ค์ต์คํธ๋ผ๋ก ํ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์์ ๊ฐ ์์๋ ์ฒซ๋ฒ์งธ ๋ฌธ๋ถํฐ ์์ํ๋ฉด
๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์๊ณ , ๊ฑฐ์ธ์ ์ง๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ๊ฑฐ์ธ์ ๊ฐ์๋ฅผ 0์ผ๋ก ์ฒดํฌํ๋ค.
๋ค์ ์งํ๋ฐฉํฅ์ ํ์ฌ ์ง์ ์ด ๊ฑฐ์ธ์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ ์๊ณ , ๊ทธ๋๋ก ์งํํด์ ํด๋น ๊ฑฐ์ธ๋ก ๊ฐ๊ฒ๋๋ค.
๊ทธ ๋ค์ ์งํ๋ฐฉํฅ์ ์ด๋ ๊ฒ ๋๋ฉฐ, ํ์ฌ ์ง์ ์ด ๊ฑฐ์ธ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ๊ฑฐ์ธ + 1์ ํ์ฌ ๋ค์ ์ง์ ์ผ๋ก ์ด๋ํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก [์ง์ ][๋ฐฉํฅ]์ ๋ํ ์ต์ ๊ฑฐ์ธ์ ์ฌ์ฉ๊ฐ์๋ฅผ ์ฒดํฌํ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
ํ์ฌ ์ง์ ์ ๊ฒฝ์ฐ์ ์๋ 3๊ฐ์ง๋ก, {#, ., !} ์ ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
#์ธ ๊ฒฝ์ฐ์๋ ๋ฐฉํฅ์ ์ ํ์ด ์๊ณ
.์ธ ๊ฒฝ์ฐ์๋ ์ด์ ์ ์งํํ๋ ๋ฐฉํฅ๋๋ก ์งํํด์ผํ๋ฉฐ
!์ธ ๊ฒฝ์ฐ์๋ ์ด์ ์ ์งํํ๋ ๋ฐฉํฅ์ ๋ฐ๋๋ฐฉํฅ์ ์ ์ธํ๊ณ ์ด๋ํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์ฝ๋
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
int N, dx[4]={0,1,0,-1}, dy[4]={1,0,-1,0}, ans[51][51][4], ansNum = 987654322, startX, startY;
string board[51];
void solve(int x, int y) {
queue<pair< pair<int, int>, pair<int, int> > >q;
q.push(make_pair(make_pair(x, y), make_pair(-1, 0)));
while(!q.empty()) {
auto cur = q.front().first; int curDir = q.front().second.first; int curDist = q.front().second.second; q.pop();
char curBoard = board[cur.first][cur.second];
if(curBoard == '#') {
for(int dir=0; dir<4; dir++) {
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
if(ans[nx][ny][dir] > curDist) {
ans[nx][ny][dir] = curDist;
q.push(make_pair(make_pair(nx,ny), make_pair(dir, curDist)));
}
if(board[nx][ny] == '#'&& (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][dir]);
}
}else if(curBoard == '!') {
for(int dir=0; dir<4; dir++) {
if(dir == (curDir+2)%4) continue;
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
int addiDist = (curDir == dir)?0:1;
if(ans[nx][ny][dir] > curDist + addiDist) {
ans[nx][ny][dir] = curDist + addiDist;
q.push(make_pair(make_pair(nx,ny), make_pair(dir, curDist + addiDist)));
}
if(board[nx][ny] == '#' && (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][dir]);
}
}else if(curBoard == '.') {
int nx = cur.first + dx[curDir];
int ny = cur.second + dy[curDir];
if(nx<0||nx>=N||ny<0||ny>=N||board[nx][ny] == '*') continue;
if(ans[nx][ny][curDir] > curDist) {
ans[nx][ny][curDir] = curDist;
q.push(make_pair(make_pair(nx,ny), make_pair(curDir, curDist)));
}
if(board[nx][ny] == '#'&& (nx != startX || ny != startY)) ansNum = min(ansNum, ans[nx][ny][curDir]);
}
}
}
int main(){
cin>>N;
for(int i=0; i<N; i++) cin>>board[i];
for(int i=0; i<N; i++)
for(int j=0; j<N; j++){
if(board[i][j] == '#'){
startX = i; startY = j;
}
for(int k=0; k<4; k++)
ans[i][j][k] = 987654321;
}
for(int i=0; i<4; i++)
ans[startX][startY][i] = 0;
solve(startX, startY);
cout<<ansNum;
}
'algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 31846 (0) | 2024.06.24 |
---|---|
๋ฐฑ์ค 31845 (0) | 2024.06.21 |
๋ฐฑ์ค 28325 (0) | 2024.06.13 |
๋ฐฑ์ค 1987 (1) | 2024.06.12 |
Codeforces Round 938 (Div. 3) (0) | 2024.05.02 |