1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
   | #include <stdio.h> #include <string.h>
  #define M 8 #define MAXN 1000 #define INF 0x8000000
  typedef struct{ 	int x,y; }point;
  point qu[MAXN];
  int vis[3][M][M]; int move[8][2] = {{1,2}, {1,-2}, {-1,2}, {-1,-2}, {2,1}, {2,-1}, {-2,1}, {-2,-1}};
  int check(int x, int y, int n){     if( x>=0 && x <8 && y>=0 && y <8 && vis[n][x][y] == -1)     	return 1;     else     	return 0; }
  void bfs_solve(int n, int x, int y){
       int i, head = 0, tail = -1;      point tp;
       memset(vis[n], -1, sizeof(vis[n]));      vis[n][x][y] = 0;      tp.x = x;      tp.y = y;      qu[++tail] = tp;
       while(head <= tail){      	int nowx, nowy;         tp = qu[head++];         nowx = tp.x;         nowy = tp.y;
          for(i=0; i<8; ++i){            int nx,ny;            nx = nowx + move[i][0];            ny = nowy + move[i][1];
             if(check(nx, ny, n)){               vis[n][nx][ny] = vis[n][nowx][nowy] + 1;               tp.x = nx;               tp.y = ny;               qu[++tail] = tp;            }
          }      } }
  void solve(int ch[][2]){     int i,j;
      for(i=0; i<3; ++i){        bfs_solve(i, ch[i][0], ch[i][1]);     }
      int ans = INF;     for(i=0; i<M; ++i)     	for(j=0; j<M; ++j){     	    int res = vis[0][i][j] + vis[1][i][j] + vis[2][i][j];     	    if(ans > res)     	    	ans = res;     	}     printf("%d\n", ans); }
 
  int main(){     int i,j,T;     int ch[3][2];
   	     while(scanf("%d", &T) != EOF){
        for(j = 0; j<T; j++){       	  char tmp[3];
  	      for(i = 0; i < 3; ++i){ 	          scanf("%s", &tmp); 	          ch[i][0] = tmp[0] - 'A'; 	          ch[i][1] = tmp[1] - '1';  	      }
  	      solve(ch);       }     } 	return 0; }
   |