๋ฌธ์ :
13460๋ฒ: ๊ตฌ์ฌ ํ์ถ 2
์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 โค N, M โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.', '#', 'O', 'R', 'B'
www.acmicpc.net
๋ถ์ :
์ด ๋ฌธ์ ๋ ์ผ์ฑ ์ด์ฉ๊ตฌ ์ญ๋ ๊ธฐ์ถ ๋ฌธ์ ์๋ค. ์์ง ๊ธฐ์ถ ๋ฌธ์ ์ ๋ํ ๊ฐ์ด ์๋ค. ๊ธฐ์ ์ฝ๋ฉํ ์คํธ๋ ๋ค ๊ธฐ์ ์ฝ๋ฉํ ์คํธ ๊ฐ์์ ๋ง์ด๋ค ํํ
์ด์ฉผ๋ ๊ทธ๋ํ ์ด๋ก ์ ๋ณต์ตํ๋ ์์ค์ ํ๋ฒ ํ์ด๋ณผ๊น ? ํด์ ๋์ ํ๊ฒ ๋์๋ค. ๋ฌธ์ ๋ฅผ ์ฝ๋ค๊ฐ ์ดํด๊ฐ ๋๋ฉด ๋ฌธ์ ํฌ๊ธฐ๋ฅผ ๋ชปํ๊ฒ ๋ค.
input ๋ฐ๋๊ฒ๋ง ๋ง๋ค๊ณ ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋๋ค์ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ๊ฒจ์ฐ ๊ฒจ์ฐ ํ์๋ค. ์ด ๋ง์ ๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๊ณ์ ํ๋ฆฌ๋ค๊ฐ ๊ฒจ์ฐ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค ํ๊ณ ๋ง์ถฐ์ค ๋๋ ..
๋ฐฑ์ค ์ง๋ฌธ ๊ธ์ ํตํด visit ๋ฐฐ์ด์ 4์ฐจ์์ผ๋ก ํด์ผ ํ๋ ์ด์ ๋ฅผ ์๊ฒ ๋์๋ค. ๊ตฌ์ฌ์ด ๋์์ ํต๊ณผํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ฐ์ด ๊ฒ์ฌํด์ผํ๋ค๋ ๊ฒ! ๊ทธ๋์ 4์ฐจ์ ๋ฐฐ์ด์ ์จ์ผ ํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธ๋ ๊ณณ์ ๋ ๊ฐ๋ค๋ ๋ป์ ์๋ ๊ธธ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 10๋ฒ ์์ ํต๊ณผํ์ง ๋ชปํ ์๋ ์์ด ์๋ ๊ธธ์ ๊ฐ์ง ์์์ผ ํ๋ค๋ ๋ป์ ์์ํ๊ณ ์๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ ๊ธฐํ ์ ์ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์์ ๋ ๊ตฌ์ฌ์ด ๊ฐ์ ์ธ๋ฑ์ค์ ๊ฐ์ด ๋จธ๋ฌด๋ฅผ์๊ฐ ์์ํ ๋ฐ ๊ทธ๋ฌ๋ฉด ์๋๋ฏ๋ก ์ด์ ์์น์์ ์์ง์ธ ์์น๋ก ๊ฐ ๊ธธ์ด๊ฐ ๋ ๋ง์ ์น๊ตฌ์ ์ธ๋ฑ์ค ๊ฐ์ ์๋ ๋ฐฉํฅ์ผ๋ก ํ๋ ๊ฐ์์์ผ์ค๋ค๊ณ ํ๋ค!
์ฌ๋ฌ๋ชจ๋ก ์ ๊ธฐํ ๊ฒ๋ค์ด ๋ง์๋ ๋ฌธ์ ์๋ค ๊ธ๊ณ ๋ ์ด๋ ต๋ค ใ
c++ ์ฝ๋ :
//
// 13460_marbleEscape2.cpp
// SOMA๐ฉ๐ปโ๐ป
//
// Created by JoSoJeong on 2021/04/22.
//
#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>
using namespace std;
char map[11][11];
bool visit[11][11][11][11] = {false, };
int N, M;
pair<int, int> redStart;
pair<int, int> blueStart;
pair<int, int> holeStart;
int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };
int find_hole_bfs(){
queue<pair<pair<int, int>, pair<int, int>>>q; // red๊บผ, blue๊บผ
q.push({redStart, blueStart}); // ํ์ red blue๊บผ x, y ์์ผ๋ก push
visit[redStart.first][redStart.second][blueStart.first][blueStart.second] = true;
int result = 0; //๋ต
if(result == 10){
return -1;
}
while(!q.empty()){
int size = (int)q.size();
while(size--){
pair<pair<int, int>, pair<int, int>> cur = q.front();
q.pop();
int redX = cur.first.first;
int redY = cur.first.second;
int blueX = cur.second.first;
int blueY = cur.second.second;
if(map[redX][redY] == 'O' && map[redX][redY] != map[blueX][blueY]){ // ๊ตฌ๋ฉ์ ์ฐพ์ผ๋ฉด ๊ทผ๋ฐ ๊ฐ์ด ํต๊ณผํ์ง ์์ผ๋ฉด
return result;
}
// ์์ง์ด์
for(int i =0; i < 4; i++){
int nextRedX = redX;
int nextRedY = redY;
int nextBlueX = blueX;
int nextBlueY = blueY;
while(map[nextRedX + dx[i]][nextRedY + dy[i]] != '#' && map[nextRedX][nextRedY] != 'O'){
nextRedX += dx[i];
nextRedY += dy[i];
}
while(map[nextBlueX + dx[i]][nextBlueY + dy[i]] !='#' && map[nextBlueX][nextBlueY] != 'O'){
nextBlueX += dx[i];
nextBlueY += dy[i];
}
if(map[nextBlueX][nextBlueY] == 'O') // ํ๋ ๊ณต์ด ๋จผ์ ๋์ฐฉํ์ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ!! ์ด๋ถ๋ถ ์ํด์ ํ๋ ธ๋ค.
{
continue;
}
if(nextRedX == nextBlueX && nextRedY == nextBlueY){ // ๋ ๊ณต์ ์์น๊ฐ ๊ฐ๋ค๋ฉด
//์์ง์ธ ๊ฑฐ๋ฆฌ๋ก ๋๊ฐ ๋ค์ ๊ฐ์ง ํ๋ณ
if(map[nextRedX][nextRedY] == 'O')
{
continue;
}
if(abs(nextRedX- redX) + abs(nextRedY - redY) < abs(nextBlueX - blueX) + abs(nextBlueY - blueY)){
nextBlueX -= dx[i];
nextBlueY -= dy[i];
}else{
nextRedX -= dx[i];
nextRedY -= dy[i];
}
}
if (visit[nextRedX][nextRedY][nextBlueX][nextBlueY]) continue; // ๋ฐฉ๋ฌธ ํ๋ค๋ฉด ๋ฌด์
visit[nextRedX][nextRedY][nextBlueX][nextBlueY] = true; // ๋ฐฉ๋ฌธ ํ์
q.push({ {nextRedX,nextRedY}, {nextBlueX, nextBlueY}});
}
}
if (result >= 10) return -1; // ๋ฌธ์ ์กฐ๊ฑด
result++;
}
return -1; // queue๊ฐ ๋น์ด์์๋
}
int main(){
cin >> N >> M;
for(int i = 1; i<= N; i++){
for(int j = 1; j<= M; j++){
char temp;
cin >> temp;
if(temp == 'R'){
redStart = make_pair(i, j); // ๋นจ๊ฐ ๊ตฌ์ฌ ์์ ์์น ๊ธฐ๋ก
}else if(temp == 'B'){
blueStart = make_pair(i, j);
}else if(temp == 'O'){
holeStart = make_pair(i, j);
}
map[i][j] = temp;
}
}
// for(int i = 1; i<= N; i++){
// for(int j = 1; j<= M; j++){
// cout << map[i][j] << " ";
// }
// cout <<'\n';
// }
cout << find_hole_bfs() << '\n';
return 0;
}
'Algorithm๐ฐ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9095 1,2,3 ๋ํ๊ธฐ DP (0) | 2021.05.04 |
---|---|
[๋ฐฑ์ค] 1937 ์์ฌ์์ด ํ๋ค ๐ผ DP (0) | 2021.05.02 |
[๋ฐฑ์ค] 2583 ์์ญ ๊ตฌํ๊ธฐ DFS (0) | 2021.04.22 |
[๋ฐฑ์ค] 1697 ์จ๋ฐ๊ผญ์ง BFS (0) | 2021.04.21 |
[๋ฐฑ์ค] 9012 ๊ดํธ string (0) | 2021.04.21 |
๋๊ธ