牛客 [跳马游戏]
题目:
思路:
广搜,遇到终点或者队列为空退出,
遇到能进的点就加入队列,每次从队列前面的开始搜
第一次遇到肯定是路径最短的
因为题目最大长度为400,所以直接定义数组就行,不用vector
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAX = 1e5 + 5;
int Map[500][500];
int N,M;//地图大小
int Zx,Zy;//终点坐标
int val=-1;
typedef struct A{
int x;
int y;//坐标
int sum;//步数
};
queue<A> q;
void bfs(A end){
if(Map[end.x][end.y]==0){
if(end.sum==0){
Map[end.x][end.y]=-1;
}else{
Map[end.x][end.y]=end.sum;
}
}else{
return ;
}
if(end.x==Zx&end.y==Zy){
val=end.sum;
return ;
}
int mark[][2]={{1,-2},{1,2},{-1,2},{-1,-2},{2,-1},{2,1},{-2,-1},{-2,1} };
for(int i=0;i<8;i++){
A site;
site.x=end.x+mark[i][0];
site.y=end.y+mark[i][1];
site.sum=end.sum+1;
if(site.x>=1&&site.x<=N&&site.y>=1&&site.y<=M&&Map[site.x][site.y]==0){
q.push(site);
}
}
}
int main(){
A star;
cin>>N>>M>>star.x>>star.y>>Zx>>Zy;
star.sum=0;
q.push(star);
while (q.size()&&val==-1){
A t=q.front();
q.pop();
bfs(t);
}
cout<<val;
return 0;
}