| #include <stdio.h>  #include <queue> #include <string.h> #include <algorithm> #include <stdlib.h> using namespace std; int g[64][64]; int testcase, N, M, P; int sx, sy, ex, ey; void bfs() {     int dp[64][64][8][8] = {};     queue<int> X, Y, VX, VY;     int x, y, vx, vy, tx, ty, dx, dy;     dp[sx][sy][0+3][0+3] = 1;     X.push(sx), Y.push(sy), VX.push(0), VY.push(0);     while(!X.empty()) {         x = X.front(), X.pop();         y = Y.front(), Y.pop();         vx = VX.front(), VX.pop();         vy = VY.front(), VY.pop();         if(x == ex && y == ey) {             printf("Optimal solution takes %d hops.\n", dp[x][y][vx+3][vy+3]-1);             return;         }         for(int i = -1; i <= 1; i++) {             for(int j = -1; j <= 1; j++) {                 dx = vx + i, dy = vy + j;                 if(abs(dx) <= 3 && abs(dy) <= 3) {                     tx = x + dx, ty = y + dy;                     if(tx < 0 || tx >= N || ty < 0 || ty >= M || dp[tx][ty][dx+3][dy+3])                         continue;                     if(g[tx][ty])                         continue;                     dp[tx][ty][dx+3][dy+3] = dp[x][y][vx+3][vy+3] + 1;                     X.push(tx), Y.push(ty);                     VX.push(dx), VY.push(dy);                 }              }         }     }     puts("No solution."); } int main() {     scanf("%d", &testcase);     while(testcase--) {         scanf("%d %d", &N, &M);         scanf("%d %d %d %d", &sx, &sy, &ex, &ey);         scanf("%d", &P);         memset(g, 0, sizeof(g));         for(int i = 0; i < P; i++) {             int lx, ly, rx, ry;             scanf("%d %d %d %d", &lx, &rx, &ly, &ry);             for(int p = lx; p <= rx; p++)                 for(int q = ly; q <= ry; q++)                     g[p][q] = 1;         }         bfs();     }     return 0; }
 |