思路:BFS搜索最短路,这题和普通迷宫BFS暴搜不同的是这道题的偏移量不是按照普通的上下左右走,而是按照马走日,所以偏移量要自己处理一下,画图可以知道有8个方向
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include <cmath>
#define PII pair<int,int>
using namespace std;
int n,m;
const int N=300;
char s[N][N];
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int dis[N][N];
bool check(int x,int y)
{
if(x<0||y<0||x>=n||y>=m||dis[x][y]!=-1||s[x][y]=='*')return false;
return true;
}
int BFS(PII start,PII end)
{
queue<PII> q;
q.push(start);
memset(dis,-1,sizeof(dis));
dis[start.first][start.second]=0;
while(!q.empty()){
PII t=q.front();q.pop();
if(t==end)return dis[t.first][t.second];
for(int i=0;i<8;i++){
int xx=dir[i][0]+t.first,yy=dir[i][1]+t.second;
if(check(xx,yy)){
dis[xx][yy]=dis[t.first][t.second]+1;
q.push(make_pair(xx,yy));
}
}
}
return -1;
}
int main()
{
cin>>m>>n;
PII start,end;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];
if(s[i][j]=='K')start={i,j};
else if(s[i][j]=='H')end={i,j};
}
}
cout<<BFS(start,end)<<endl;
return 0;
}