| #include <vector>#include <iostream>
 #include <fstream>
 #include <queue>
 #include <climits>
 #include <cstring>
 
 using namespace std;
 
 int R, C;
 int sum[32][32];
 int dist[32][32][32][32];
 struct Node {
 int x, y, d;
 Node(int x, int y, int d) : x(x), y(y), d(d) {}
 };
 vector<Node> knights;
 Node king(0, 0, 0);
 int x, y;
 char yc;
 
 bool onGrid(int x, int y) {
 if (x < 1 || y < 1 || x > R || y > C) return false;
 return true;
 }
 
 void knightBFS(Node k) {
 queue<Node> q;
 q.push(k);
 int sx = k.x, sy = k.y;
 int dx[] = {2, 2, -2, -2, 1, -1, 1, -1};
 int dy[] = {1, -1, 1, -1, 2, 2, -2, -2};
 
 while (!q.empty()) {
 auto node = q.front();
 q.pop();
 int x = node.x, y = node.y;
 dist[x][y][x][y] = 0;
 for (int i = 0; i < 8; ++i) {
 int xx = x + dx[i];
 int yy = y + dy[i];
 if (!onGrid(xx, yy)) continue;
 if (dist[sx][sy][xx][yy] != -1) continue;
 q.emplace(Node(xx, yy, node.d + 1));
 dist[sx][sy][xx][yy] = node.d + 1;
 }
 }
 }
 
 int main() {
 ifstream fin("camelot.in");
 ofstream fout("camelot.out");
 fin >> R >> C;
 bool kingFound = false;
 while (fin >> yc >> x) {
 y = yc - 'A' + 1;
 if (!kingFound) {
 king = Node(x, y, 0);
 kingFound = true;
 } else {
 knights.emplace_back(Node(x, y, 0));
 }
 }
 
 memset(dist, -1, sizeof(dist));
 memset(sum, 0, sizeof(sum));
 
 for (int i = 1; i <= R; ++i) {
 for (int j = 1; j <= C; ++j) {
 knightBFS(Node(i, j, 0));
 }
 }
 
 for (auto &knight : knights) {
 for (int i = 1; i <= R; ++i) {
 for (int j = 1; j <= C; ++j) {
 sum[i][j] += dist[knight.x][knight.y][i][j];
 }
 }
 }
 
 int ans = INT_MAX;
 const int MAX_STEP = 3;
 for(int i = 1; i <= R; ++i) {
 for(int j = 1; j <= C; ++j) {
 for(int dx = -MAX_STEP; dx <= MAX_STEP; ++dx) {
 for(int dy = -MAX_STEP; dy <= MAX_STEP; ++dy) {
 for(auto &knight : knights) {
 if (!onGrid(king.x + dx, king.y + dy)) continue;
 int kx = knight.x, ky = knight.y;
 int d1 = dist[king.x + dx][king.y + dy][i][j],
 d2 = dist[kx][ky][king.x + dx][king.y + dy];
 if (d1 == -1 || d2 == -1) continue;
 
 int distance = sum[i][j] -dist[kx][ky][i][j] + d1 + d2
 + std::max(abs(dx),abs(dy));
 ans = std::min(distance, ans);
 }
 }
 }
 }
 }
 
 for(int i = 1; i <= R; ++i) {
 for(int j = 1;j<= C; ++j) {
 if (sum[i][j] < 0) continue;
 ans = min(sum[i][j] + max(abs(i - king.x), abs(j - king.y)),ans);
 }
 }
 
 cout << ans << endl;
 fout << ans << endl;
 }
 
 
 |