λ°±μ€ 2151
λ¬Έμ
μ±μμ΄λ κ±°μΈμ λ€μ¬λ€λ³΄λ κ²μ μ°Έ μ’μνλ€. κ·Έλμ μ§ κ³³κ³³μ κ±°μΈμ μ€μΉν΄λκ³ μ§ μμ λμλ€λ λλ§λ€ κ±°μΈμ 보곀 νλ€.
μ±μμ΄λ μ ν΄λ₯Ό λ§μ΄νμ¬ μ΄μ¬λ₯Ό νκ² λμλλ°, κ±°μΈμ μ’μνλ κ·Έλ μ μ±κ²© λλ¬Έμ μ μ§μλ κ±°μΈμ λ§€λ¬λ§ν μμΉκ° μ¬λ¬ κ³³ μλ€. λν μ±μμ΄λ€ μ μ§μλ λ¬Έμ΄ λ κ° μλλ°, μ±μμ΄λ κ±°μΈμ μ μ€μΉνμ¬ μ₯λμ μΉκ³ μΆμ΄μ‘λ€. μ¦, ν μͺ½ λ¬Έμμ λ€λ₯Έ μͺ½ λ¬Έμ λ³Ό μ μλλ‘ κ±°μΈμ μ€μΉνκ³ μΆμ΄μ‘λ€.
μ±μμ΄λ€ μ§μ λν μ λ³΄κ° μ£Όμ΄μ‘μ λ, ν μͺ½ λ¬Έμμ λ€λ₯Έ μͺ½ λ¬Έμ λ³Ό μ μλλ‘ νκΈ° μν΄ μ€μΉν΄μΌ νλ κ±°μΈμ μ΅μ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
κ±°μΈμ μ€μΉν λμλ 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;
}