简单的BFS,但还是花了266ms,真不知道牛人们是怎么0ms的 // pku1915 Knight Moves #include <queue> #include <cstdio> using namespace std; typedef long INT32; //typedef unsigned char BYTE; #define MAX_N 300 struct POS { INT32 x; INT32 y; POS() {} POS(INT32 in_x, INT32 in_y) { x=in_x; y=in_y; } inline POS operator+ (const POS& right) { return POS(x+right.x, y+right.y); } inline bool isValid(INT32 len) { return (x>=0)&&(x<len)&&(y>=0)&&(y<len); } inline bool operator!=(const POS& right) { return (x!=right.x)||(y!=right.y); } inline bool operator==(const POS& right) { return (x==right.x)&&(y==right.y); } }; POS posMoves[8] = {POS(1,2), POS(2,1), POS(2,-1), POS(1,-2), POS(-1,-2), POS(-2,-1), POS(-2,1), POS(-1,2)}; typedef queue<POS> QUE_POS; INT32 board[MAX_N][MAX_N]; int main() { INT32 i; INT32 n, N; INT32 len; scanf("%ld", &N); for (n=0; n<N; n++) { POS posOrg, posDst; scanf("%ld%ld%ld%ld%ld", &len, &(posOrg.x), &(posOrg.y), &(posDst.x), &(posDst.y)); INT32 steps = 1; if ( posOrg != posDst ) { bool bNotFound = true; for (i=0; i<len; i++) memset(board[i], 0, len*sizeof(board[0][0])); QUE_POS que; POS pos = posOrg; que.push(pos); board[pos.x][pos.y] = steps; while ( bNotFound ) { pos = que.front(); que.pop(); steps = board[pos.x][pos.y] + 1; INT32 m; for (m=0; m<8; m++) { POS posNext = pos + posMoves[m]; if ( posNext.isValid(len) && (0==board[posNext.x][posNext.y]) ) { if (posNext == posDst) { bNotFound = false; break; } que.push(posNext); board[posNext.x][posNext.y] = steps; } } } } printf("%ld/n", steps - 1); } }