문제 : https://www.acmicpc.net/problem/16930
1)문제분류
-BFS
2)문제 해결
기본 BFS이지만 주의해야할 점은
해당방향으로 최대 k만큼 이동하는데 이동하다가,
#또는 범위를 넘어버리면 바로 탈출하고 (점프가 안되기때문)
다른방향에서 또 탐색
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m, k;
char map[1002][1002];
bool chk[1002][1002];
int sx, sy, ex, ey;
int xrr[4] = { 0,0,1,-1 };
int yrr[4] = { 1,-1,0,0 };
typedef struct Data
{
int x, y, cnt;
}Data;
bool range(int rx, int ry)
{
if (rx<1 || ry<1 || rx>n || ry>m)return false;
else return true;
}
void bfs()
{
queue<Data>pq;
pq.push({ sx,sy,0 });
chk[sx][sy] = true;
while (!pq.empty())
{
Data output = pq.front();
pq.pop();
if (output.x == ex && output.y == ey)
{
cout << output.cnt << endl;
return ;
}
for (int i = 0; i < 4; i++)
{
Data input;
input.x = output.x;
input.y = output.y;
for (int j = 0; j < k; j++)
{
int cx = input.x + xrr[i];
int cy = input.y + yrr[i];
if (range(cx, cy)&& map[cx][cy] == '.')
{
if (chk[cx][cy] == false)
{
chk[cx][cy] = true;
pq.push({ cx,cy,output.cnt + 1 });
}
input.x = cx;
input.y = cy;
}
else
break;
}
}
}
cout << -1 << endl;
return;
}
int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> map[i][j];
}
}
cin >> sx >> sy >> ex >> ey;
bfs();
}
'알고리즘문제풀이' 카테고리의 다른 글
[백준 3109]빵집 (0) | 2019.02.19 |
---|---|
[백준 1389]케빈 베이컨의 6단계 법칙 (0) | 2019.02.19 |
[백준 16929] Two Dots (0) | 2019.02.14 |
[백준 16928]뱀과 사다리 게임 (0) | 2019.02.14 |
[백준 2966] 찍기 (0) | 2019.02.14 |