Skakač

Na šahovskoj tabli dimenzija \(8 \times 8\) nalaze se dva skakača. Skakač se kreće tako što izabere jedan od 4 smera (gore, dole, levo i desno), pomeri se 2 polja u tom smeru, a zatim odabere jedan od smerova koji su normalni u odnosu na prvi smer kretanja i pomeri se još jedno polje u tom smeru.

Za svaki od upita koji predstavljaju koordinate polja na kojima se nalaze skakači ispitati u koliko najmanje poteza jedan skakač može stići na polje na kom se nalazi drugi skakač.

Opis ulaza

Sa standardnog ulaza se učitava broj \(n\), a zatim i \(n\) upita oblika \(x1\ y1\ x2\ y2\).

Opis izlaza

Za svaki od \(n\) upita ispisati koliko je najmanje poteza potrebno jednom skakaču da stigne do polja na kom se nalazi drugi.

Primer

Ulaz

5 1 1 5 7 1 2 1 5 3 3 3 3 4 6 2 7 8 8 1 1

Izlaz

4 3 0 1 6

Rešenje

Opis glavnog rešenja

U ovom bloku se opisuje glavno rešenje zadatka.

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

const int SIZE = 8;
const int INF = INT_MAX / 2;

void initializeDistanceMatrix(vector<vector<int>>& dist) {
   
   const vector<pair<int, int>> moves = {
      {2, 1}, {2, -1},
      {-2, 1}, {-2, -1},
      {1, 2}, {1, -2},
      {-1, 2}, {-1, -2}
   };

   dist.assign(SIZE * SIZE, vector<int>(SIZE * SIZE, INF));
   for (int i = 0; i < SIZE * SIZE; ++i) {
      dist[i][i] = 0; 
   }

   for (int x = 0; x < SIZE; ++x) {
      for (int y = 0; y < SIZE; ++y) {
         int current = x * SIZE + y;
         for (const auto& move : moves) {
               int nx = x + move.first;
               int ny = y + move.second;
               if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE) {
                  int neighbor = nx * SIZE + ny;
                  dist[current][neighbor] = 1;
               }
         }
      }
   }

   for (int k = 0; k < SIZE * SIZE; ++k) {
      for (int i = 0; i < SIZE * SIZE; ++i) {
         for (int j = 0; j < SIZE * SIZE; ++j) {
               if (dist[i][k] + dist[k][j] < dist[i][j]) {
                  dist[i][j] = dist[i][k] + dist[k][j];
               }
         }
      }
   }
}

int main() {
   vector<vector<int>> dist;
   initializeDistanceMatrix(dist);

   int n;
   cin >> n;
   for (int i = 0; i < n; ++i) {
      int x1, y1, x2, y2;
      cin >> x1 >> y1 >> x2 >> y2;
      int start = (x1-1) * SIZE + (y1-1);
      int end = (x2-1) * SIZE + (y2-1);
      cout << dist[start][end] << endl;
   }

   return 0;
}