直接bfs,水题。 #include<iostream> using namespace std; #define N 310 struct Point { int row,col,dist; }; Point queue[N*N]; int visited[N][N]; int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}}; int bfs(int st_i,int st_j,int en_i,int en_j,int n) { int front=-1,rear=0,next_row,next_col; memset(visited,0,sizeof(visited)); queue[0].row=st_i; queue[0].col=st_j; queue[0].dist=0; visited[st_i][st_j]=1; Point temp,add; while(front<rear) { temp=queue[++front]; if(temp.row==en_i&&temp.col==en_j) break; for(int i=0;i<8;i++) { next_row=temp.row+dir[i][0]; next_col=temp.col+dir[i][1]; if(next_row>-1&&next_row<n&&next_col>-1&&next_col<n &&!visited[next_row][next_col]) { visited[next_row][next_col]=1; add.row=next_row; add.col=next_col; add.dist=temp.dist+1; queue[++rear]=add; } } } return temp.dist; } int main() { int ca,n,st_i,st_j,en_i,en_j; scanf("%d",&ca); while(ca--) { scanf("%d%d%d%d%d",&n,&st_i,&st_j,&en_i,&en_j); printf("%d/n",bfs(st_i,st_j,en_i,en_j,n)); } return 0; }