2151. ๊ฑฐ์ธ์ค์น
by rlaehddnd0422
https://www.acmicpc.net/problem/2151
Point
- "#" โถ๏ธ ๋ฌธ
- "!" โถ๏ธ ๊ฑฐ์ธ ์ค์น ๊ฐ๋ฅํ ๊ตฌ์ญ
- "*" โถ๏ธ ๋ฒฝ
- ๊ฑฐ์ธ์ 45๋ ๊ธฐ์ธ์ด์ง ๋๊ฐ์ ์ผ๋ก ์ค์นํด์ผ ํ๋ค.
- ๋ฌธ์์ ๋ฌธ์ ๋ณด๊ธฐ ์ํด ๊ฑฐ์ธ์ ์ค์นํ ๋, ์ค์นํด์ผ ํ๋ ๊ฑฐ์ธ์ ์ต์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ .
๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
ํ ์คํธ์ผ์ด์ค 1๋ฒ์ ๊ฒฝ์ฐ์๋
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฑฐ์ธ์ ์ค์นํ๋ฉด ๋ฌธ์์ ๋ฌธ์ ๋ณผ ์ ์๋ค.
Point1 )
์ฐ์ ๊ฑฐ์ธ๊ณผ ๋ฌธ์ ๋ฒํธ๋ฅผ ์ง์ ํด์ฃผ๋ คํ๋ค.
๋ฌธ์ ์์๋ฒํธ์ ๋๋ฒํธ๋ฅผ ๋ฐ๋ก ์ ์ฅํด๋๊ธฐ๋ง ํ๋ฉด ๋ฌธ๊ณผ ๊ฑฐ์ธ ๋ชจ๋ ํ๋์ ๋ฒกํฐ๋ก ์ทจ๊ธํ ์ ์๋ค ( ์ฝ๋ ์ฐธ์กฐ )
Point2)
dist[Start์์ ๊ฐ ์ ์๋ ๊ฑฐ์ธ๋ฒํธ]์ 0๊ฐ์ ์ฅ , ๊ฐ ์ ์๋ ๋ฒํธ๋ค push
-> pop -> dist[popํ ๊ฑฐ์ธ๋ฒํธ์์ ๊ฐ ์ ์๋ ๋ฒํธ]์ +1 ์ ์ฅ, ๊ฐ ์ ์๋ ๋ฒํธ๋ค push
๋ก์ง์ ๋ฐ๋ณตํ๋ฉด์ BFS๋ฅผ ์งํํด์ฃผ๋ฉด ๋๋ค.
์์ค์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n'
using namespace std;
int dy[]={-1,1,0,0};
int dx[]={0,0,-1,1};
int n;
vector<vector<char>> area(51,vector<char>(51));
vector<pair<int,int>> mirror;
vector<vector<int>> mirrorNum(51,vector<int>(51));
vector<vector<int>> doorNum(51,vector<int>(51));
vector<pair<int,int>> door;
int start=-1;
int dest=-1;
void bfs(int start,vector<int>&dist, vector<vector<bool>>&check)
{
queue<int>q;
q.push(start);
while(!q.empty())
{
int now = q.front();
q.pop();
for(int i=0;i<mirror.size();i++)
{
// ํ์ฌ ๋ฒํธ์์ i๋ฒํธ๋ก ๊ฐ ์ ์๊ณ , dist์ ๊ธฐ๋ก๋์ง ์์๋ค๋ฉด
if(check[now][i] && dist[i]==-1)
{
dist[i] = dist[now]+1;
// cout << i << ' ' << dist[i] << endl;
q.push(i);
}
}
}
}
int main()
{
FASTio;
cin >> n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin >> area[i][j];
// ๋ฌธ์ธ ๊ฒฝ์ฐ -> ์์์ ๊ณผ ๋์ ๋ง ๊ธฐ๋กํ๋ค๋ฉด ๊ฑฐ์ธ๊ณผ ๋์ผํ๊ฒ ์ทจ๊ธํด๋ ๋จ.
if(area[i][j]=='#')
{
// ์์๋ฒํธ ๊ธฐ๋ก
if(start==-1)
{
start = mirror.size();
}
// ๋๋ฒํธ๊ธฐ๋ก
else
{
dest = mirror.size();
}
mirror.push_back({i,j});
// ์ขํ์ ๊ฑฐ์ธ ๋ฒํธ ๊ธฐ๋ก
mirrorNum[i][j] = mirror.size()-1;
}
else if(area[i][j]=='!')
{
mirror.push_back({i,j});
// ์ขํ์ ๊ฑฐ์ธ ๋ฒํธ ๊ธฐ๋ก
mirrorNum[i][j] = mirror.size()-1;
}
}
}
vector<vector<bool>>check(mirror.size(),vector<bool>(mirror.size(),false));
for(int i=0;i<mirror.size();i++)
{
for(int k=0;k<4;k++)
{
// ๊ฑฐ์ธ ๋ฒํธ๋ฅผ ํตํด์ ๊ฑฐ์ธ ์ขํ๋ฅผ ๋ฝ์๋
int ny = mirror[i].first + dy[k];
int nx = mirror[i].second + dx[k];
while(1)
{
// ์์ญ ๋ฐ์ธ๊ฒฝ์ฐ break
if(!(ny>=0 && nx>=0 && nx<n && ny<n))
{
break;
}
// ๋ฒฝ์ ๋ง๋ ๊ฒฝ์ฐ break
if(area[ny][nx]=='*')
{
break;
}
// ๊ฑฐ์ธ์ด๋ ๋ฒฝ์ ๋ง๋๊ฒฝ์ฐ
if(area[ny][nx]=='#' || area[ny][nx]=='!')
{
// i๋ฒ์์ mirrorNum[ny][nx] ๋ฒ์งธ ๊ฑฐ์ธ๋ก ๊ฐ ์ ์์์ ์๋ฏธํจ
check[i][mirrorNum[ny][nx]] = true;
// cout << i << ' ' << mirrorNum[ny][nx] << endl;
}
// ์กฐ๊ฑด ๋ด์์
// ์๋๊น์ง ์ดํ-> ์๋๋๊น์ง์ดํ -> ์ข๋๊น์ง ์ดํ -> ์ฐ ๋๊น์ง ์ดํ
ny += dy[k];
nx += dx[k];
}
}
}
vector<int> dist(mirror.size(),-1);
bfs(start,dist,check);
cout << dist[dest];
return 0;
}
๋ฌธ์ ๋ฅผ ์ดํดํ๋๋ฐ ๊ต์ฅํ ์ค๋๊ฑธ๋ ธ๋ค.. ๋ฌธ์ ์ดํด๋ฟ๋ง ์๋๋ผ ๊ฑฐ์ธ์ 45๋๋ก ์ค์นํ๋ค๋ ์ ์์ ๊ฑฐ์ธ์ ์ด๋ป๊ฒ ์ค์นํด์ผ ๋๋์ง ์์ด๋์ด๋ ์ ๋ ์ฌ๋ผ์ ๋๊ฐํ๋ค. ๊ฐ์๋ฅผ ๋ณด๊ณ ๊ฒจ์ฐ ๋ฌธ์ ๋ ๊พธ์ญ๊พธ์ญ ์ดํดํ์ง๋ง ํ์ด๋ฅผ ๋ณด๊ณ ๋์๋ ์ด๋ฐ ์์ด๋์ด๋ฅผ ์ด๋ป๊ฒ ๋ ์ฌ๋ฆฌ๋์ง ๊ฐํ๋ง ๋์๋ค. ์์ผ๋ก๋ ์กฐ๊ธ ๋ ๊ณ ๋ฏผํ๊ณ ์๊ฐํด๋ณด๊ณ ๊ตฌํํด๋ณด๋ ์ฐ์ต์ ํด์ผ๊ฒ ๋ค..
'๐ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
17142. ์ฐ๊ตฌ์ 3 (0) | 2023.02.10 |
---|---|
4991. ๋ก๋ด์ฒญ์๊ธฐ (0) | 2023.02.07 |
14442. ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2 (0) | 2023.02.01 |
1600. ๋ง์ด ๋๊ณ ํ ์์ญ์ด (0) | 2023.02.01 |
5014. ์คํํธ๋งํฌ (0) | 2023.01.28 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422