牛客 跳马游戏
题目:
链接https://ac.nowcoder.com/acm/problem/201622
思路:
根据题目可得,“跳马”能跳周围总共八步,使用bfs搜索,从初始位置出发,并用map去存每个点的步数,跳到了最终位置直接退出bfs。
代码:
#include <bits/stdc++.h>
using namespace std;
int bx[]= {1,2,2,1,-1,-2,-2,-1},by[]= {2,1,-1,-2,-2,-1,1,2}; //周围八步
queue<pair<int,int>> q;
map<pair<int,int>,int> ma;
int main() {
int n,m,x1,y_1,x2,y2;
cin >> n >> m>>x1>>y_1>>x2>>y2;
q.push({x1,y_1});
ma[{x1,y_1}]=1;
bool bo=false; //标志位,用于判断是否到达终点
while(q.size()){//bfs
int x =q.front().first;
int y = q.front().second;
q.pop();
for(int i=0;i<8;i++){//跳周围八步
int xx = x+bx[i];
int yy = y+by[i];
if(xx<=0||xx>n||yy<=0||yy>m||ma[{xx,yy}]) continue;
//数组边界与是否经过这个点了
q.push({xx,yy});
ma[{xx,yy}]=ma[{x,y}]+1;//map记录步数
if(xx==x2&&yy==y2){//到达终点直接退出
bo =true;//标志位
break;
}
}
if(bo) break;//已到达过终点直接退出bfs
}
if(bo||(x1==x2&&y2==y_1)) cout << ma[{x2,y2}]-1;//判断标志位是否为true
else cout << "-1";
return 0;
}