C++ 代码
#include <iostream>
#include <queue>
using namespace std;
const int N=155;
typedef pair<int,int> PII;
queue<PII> q;
char g[N][N];
int n,m;
bool st[N][N];
int d[N][N];
void bfs(int x,int y){
int dx[]={1,2,2,1,-1,-2,-2,-1},dy[]={2,1,-1,-2,-2,-1,1,2};
q.push({x,y});
d[x][y]=0;
st[x][y]=true;
while(q.size()){
PII t=q.front();
q.pop();
for(int i=0;i<8;i++){
int a=t.first+dx[i],b=t.second+dy[i];
if(g[a][b]=='H'){
cout<<d[t.first][t.second]+1; //上个点的步数加1就是到牛的距离
return;
}
if(a<0 || a>=n || b<0 || b>=m) continue; //是否越界
if(g[a][b]=='*' || st[a][b]) continue; //当前点是否可以走
q.push({a,b});
st[a][b]=true;
d[a][b]=d[t.first][t.second]+1;
}
}
}
int main(){
scanf("%d%d",&m,&n);
int x,y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]=='K') x=i,y=j; //找到农夫位置
}
}
bfs(x,y);
return 0;
}