int kingPath[31][31][31][31], knightsPath[31][31][31][31], mixPath[31][31][31][31]; int Q[100000][3], R, C; int res = 1<<25;
inline int max(int a, int b) { return a > b ? a : b ; } inline int min(int a, int b) { return a < b ? a : b ; } inline int abs(int a) { return a >= 0 ? a : -a ; }
for(int i = 0; i < R; i++) { for(int j = 0; j < C; j++) { int front, rear; front = rear = 0; Q[rear][0] = i; Q[rear][1] = j; Q[rear][2] = 0; rear++; while( front != rear ) { int x = Q[front][0], y = Q[front][1], z = Q[front][2]; front++; if( knightsPath[i][j][x][y] <= z ) continue; knightsPath[i][j][x][y] = z;
for(int k = 0; k < 8; k++) { int nx = x + dx[k]; int ny = y + dy[k]; if( nx < 0 || nx >= R ) continue; if( ny < 0 || ny >= C ) continue; if( z + 1 >= knightsPath[i][j][nx][ny] ) continue; //knightsPath[i][j][nx][ny] = z + 1;