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č.
Sa standardnog ulaza se učitava broj \(n\), a zatim i \(n\) upita oblika \(x1\ y1\ x2\ y2\).
Za svaki od \(n\) upita ispisati koliko je najmanje poteza potrebno jednom skakaču da stigne do polja na kom se nalazi drugi.
5 1 1 5 7 1 2 1 5 3 3 3 3 4 6 2 7 8 8 1 1
4 3 0 1 6
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;
}