본문 바로가기
알고리즘

알고리즘 스터디

by COCO1337 2021. 12. 7.

https://www.acmicpc.net/problem/7562

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

유명한 BFS 문제이다.

평범하게 나이트가 갈 수 있는 좌표를 지정해놓고 범위 안에 있는지, 이미 지나갔었는지 체크하고

답을 구했다

 

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#define ll long long int

using namespace std;

vector<int> dx = {-2, -1, 1, 2, 2, 1, -1 ,-2};
vector<int> dy = {1, 2, 2, 1, -1, -2, -2, -1};

int n, m, sx, sy, ex, ey;

bool RouteCheck(int e1, int e2) {
  return e1 >= 0 && e2 >= 0 && e1 < m && e2 < m;
}

void Solve() {
  vector<vector<int>> visit(m, vector<int>(m));
  vector<vector<bool>> ck(m, vector<bool>(m));
  queue<pair<int, int>> q;
  q.push({sx, sy});
  ck[sx][sy] = true;

  while (!q.empty()) {
    auto t = q.front();
    q.pop();

    if (t.first == ex && t.second == ey) {
      cout << visit[ex][ey] << '\n';
      return;
    }

    for (int i = 0; i < 8; ++i) {
      int a = t.first + dx[i];
      int b = t.second + dy[i];

      if (RouteCheck(a, b) && !ck[a][b]) {
        q.push({a, b});
        ck[a][b] = true;
        visit[a][b] = visit[t.first][t.second] + 1;
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  cin >> n;

  for (int i = 0; i < n; ++i) {
    cin>>m>>sx>>sy>>ex>>ey;
    Solve();
  }

  return 0;
}
반응형

'알고리즘' 카테고리의 다른 글

알고리즘 스터디  (0) 2021.12.16
알고리즘 스터디  (0) 2021.11.27
알고리즘 스터디  (0) 2021.11.22
알고리즘 스터디  (0) 2021.09.28
알고리즘 - Google Kickstart 2021 B 1번  (0) 2021.09.07

댓글