#include<bits/stdc++.h> using namespace std; int dx[12]={1,1,-1,-1,2,2,-2,-2};//定义方向增量 int dy[12]={-2,2,2,-2,1,-1,1,-1}; int a[200][200];//定义棋盘,保存到达每个步的最少步数 char b[200][200];//棋盘 int c[10000][4]; int main(){ int m,n; int q,w,e,r;//开始和结束位置 cin>>m>>n; int i,j;//定义i,j for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>b[i][j]; if(b[i][j]=='K'){ q=i; w=j; }else{ if(b[i][j]=='H'){ e=i; r=j; } } } } memset(a,-1,sizeof(a));//初始化 int g=1,h=1;//初始化队列 c[1][1]=q; c[1][2]=w; c[1][3]=0;//(s1,s2)点入队,到达该点的最少步数0 while(g<=h){ //循环8个方向,将所能到达的点入队 for(int i=0;i<8;i++){//马跳跃后的位置 int x=c[g][1]+dx[i]; int y=c[g][2]+dy[i]; //如果没有越界 if(x>=1&&y>=1&&x<=n&&y<=m&&a[x][y]!='*'){ //并且该点没有走过,则点入队 if(a[x][y]==-1){ a[x][y]=c[g][3]+1; //计算从(s1,s2)到(x,y)的最少步数 h++;//队尾+1 //x,y入队 c[h][1]=x; c[h][2]=y; c[h][3]=a[x][y]; //到达(e,r)的最小路径都被求出后输出 if(a[e][r]>0){ cout<<a[e][r]<<endl; return 0; //跳出循环,不再遍历 } } } } g++;//出队 } return 0;//返回0 } /************************************************************** Problem: 1441 User: linxichen Language: C++ Result: Accepted Time:16 ms Memory:2424 kb ****************************************************************/