#include <bits/stdc++.h>
using namespace std;
#define maxn 5005
bool visited[maxn];
int n, A, B;
int step = 0;
bool ok = false;
/*
@startx:x坐标
@starty:y坐标
*/
void findPath(int start,int end, int maxLen) {
queue<int> qu;
qu.push(start);
while(!qu.empty()) {
int size = qu.size();
for(int i = 0; i < size; i++) {
int x = qu.front();
qu.pop();
if(x == end) {//找到了,跳出for循环
ok = true;
return ;
}
int nx;
nx = x + 1;//前进1步
if(nx >= 0 && nx <= maxLen && !visited[nx]) {//剪枝很重要
visited[nx] = true;
qu.push(nx);
}
nx = x - 1;//后退1步
if(nx >= 0 && nx <= maxLen && !visited[nx]) {//剪枝很重要
visited[nx] = true;
qu.push(nx);
}
nx = 2 * x ;//跳跃
if(nx >= 0 && nx <= maxLen && !visited[nx]) {//剪枝很重要
visited[nx] = true;
qu.push(nx);
}
}
step++;
}
}
int main() {
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
std::ios::sync_with_stdio(false);
memset(visited, false, sizeof(visited));
cin >> n >> A >> B;
if(A >= B) {//剪枝
cout << A - B << endl;
return 0;
}
findPath(A, B, n);
if(ok) {
cout << step << endl;
} else {
cout << -1 << endl;
}
return 0;
}
计蒜客 一维坐标的移动(bfs搜索)
最新推荐文章于 2022-03-18 18:04:55 发布