반응형
https://www.acmicpc.net/problem/1600
1600번: 말이 되고픈 원숭이
첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있
www.acmicpc.net
[ 문제풀이 ]
1. 방문을 기록할 visited [ i ][ j ][ k ]를 만듭니다. 여기서 k는 말처럼 이동한 횟수입니다.
2. bfs를 이용하여 말처럼 이동 횟수가 K번 미만이라면 인접한 곳, 말처럼 이동합니다.
3. 만약 W-1, H-1의 좌표에 도착하면 여태 이동했던 횟수를 출력합니다.
4. 도착할 수 없다면 -1을 출력합니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include<iostream> #include<queue> using namespace std; int K, W, H; int arr[200][200]; int visited[200][200][31]; int dy[4] = { -1,1,0,0 }; //인접 int dx[4] = { 0,0,-1,1 }; int dyy[8] = { -2,-1,1,2,2,1,-1,-2 }; //말처럼 int dxx[8] = { 1,2,2,1,-1,-2,-2,-1 }; struct node { int y; int x; int k; int cnt; }; int main() { scanf("%d %d %d", &K, &W, &H); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { scanf("%d", &arr[i][j]); } } queue<node> q; q.push({ 0,0,0,0 }); visited[0][0][0] = 1; while (!q.empty()) { const int y = q.front().y; const int x = q.front().x; const int k = q.front().k; const int cnt = q.front().cnt; q.pop(); if (y == H - 1 && x == W - 1) { printf("%d", cnt); return 0; } for (int i = 0; i < 4; i++) { const int yy = y + dy[i]; const int xx = x + dx[i]; if (yy >= 0 && yy < H && xx >= 0 && xx < W) { // 인접한 곳으로 이동 if (visited[yy][xx][k] != 1 && arr[yy][xx] == 0) { visited[yy][xx][k] = 1; q.push({ yy,xx,k,cnt+1 }); } } } if (k < K) { for (int i = 0; i < 8; i++) { //말처럼 이동 const int yy = y + dyy[i]; const int xx = x + dxx[i]; if (yy >= 0 && yy < H && xx >= 0 && xx < W) { if (visited[yy][xx][k + 1] != 1 && arr[yy][xx] == 0) { visited[yy][xx][k + 1] = 1; q.push({ yy,xx,k + 1,cnt+1 }); } } } } } printf("%d", -1); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1726번 - 로봇 (C++) (0) | 2022.12.11 |
---|---|
[ 백준 ] 24042번 - 횡단보도 (C++) (0) | 2022.12.10 |
[ 백준 ] 16393번 - Lost Map (C++) (0) | 2022.12.08 |
[ 백준 ] 1016번 - 제곱 ㄴㄴ 수 (C++) (0) | 2022.12.07 |
[ 백준 ] 6091번 - 핑크 플로이드 (C++) (0) | 2022.12.06 |