현수의 제 2의 뇌
반응형
문제 풀이
일반적인 BFS 방식이다.

먼저 말처럼 이동할 수 있는 횟수가 정해져 있는데 이걸 큐에 저장하면서 말의 능력을 몇번 썼는지 확인하며 말의 능력을 쓸 수 있다면 먼저 말의 능력을 쓴다. 그리고 말의 능력을 썼을때와 쓰지 않았을때, 또 말의 능력을 쓴 횟수가 다를때의 visited는 다르기 때문에 3차원 배열을 이용해서 말의 방문 확인을 한다면 쉽게 풀 수 있다

 

 

#include <bits/stdc++.h>
using namespace std;
int graph[200][200];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int dxHorse[8] = { -1, -2, -2, -1, 1, 2, 2, 1 };
int dyHorse[8] = { -2, -1, 1, 2, 2, 1, -1, -2 };
int visited[200][200][31];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int k,H,W;
    cin >> k >> W >> H ;
    for(int i=0; i < H; i++){
        for(int j=0; j < W; j++){
            cin >> graph[i][j];
        }
    }

    // {좌표}, {이동거리, 말처럼 이동한 이동거리}
    queue<pair<pair<int,int>,pair<int,int>>> Q;
    Q.push({{0,0},{0,0}});
    visited[0][0][0]=1;
    while(!Q.empty()){
        int x = Q.front().first.first;
        int y = Q.front().first.second;
        int dist = Q.front().second.first;
        int horseCnt = Q.front().second.second;
        Q.pop();
        if(x == H - 1 && y == W - 1){
            cout << dist;
            return 0;
        }
        if(horseCnt<k){
            for(int dir=0;dir<8;dir++){
                int nx = x + dxHorse[dir];
                int ny = y + dyHorse[dir];
                if(nx < H && nx >= 0 && ny < W && ny >= 0){
                    if(graph[nx][ny]==0 && !visited[nx][ny][horseCnt+1]){
                        visited[nx][ny][horseCnt+1]=1;
                        Q.push({{nx,ny},{dist+1,horseCnt+1}});
                    }
                }
            }
        }
            for(int dir=0;dir<4;dir++){
                int nx = x + dx[dir];
                int ny = y + dy[dir];
                if(nx < H && nx >= 0 && ny < W && ny >= 0){
                    if(graph[nx][ny]==0 && !visited[nx][ny][horseCnt]){
                        visited[nx][ny][horseCnt]=1;
                        Q.push({{nx,ny},{dist+1,horseCnt}});
                    }
                }

            }
    }
    cout << "-1";
}
profile

현수의 제 2의 뇌

@부현수

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!