解题思路:队列(两个平行数组 一个是在队列中的位置以及它此时的步数)访问标记(避免访问过的数组再次访问 无用 因为它访问过 它后面的路径就重复了)
注意事项:
参考代码:
#include<stdio.h>
#define N 200001
int bfs(int n, int k){
if(n==k){
return 0;
}
if(n>k){
return (n-k);
}
int next_pos;
int vist[N]={0};//访问标记 访问过为1 未访问为0
int pos[N]; //位置数组(即队列)
int step[N]; //存走的步数
int front=0,rear=0; //队列首尾指针
pos[rear]=n; //起点入队
step[rear]=0;
vist[n]=1;
rear++;
while(front<rear){
int curren_pos = pos[front]; //出队
int curren_step = step[front];
front++;
for(int i=0; i<3; i++){
if(i==0){
next_pos = curren_pos-1;
}else if(i==1){
next_pos = curren_pos+1;
}else{
next_pos = curren_pos*2;
}
if(next_pos==k){
return curren_step+1;
}
if(next_pos>=0 && next_pos<N && !vist[next_pos]){
pos[rear]=next_pos;
step[rear]=curren_step+1;
vist[next_pos]=1;
rear++;
}
}
}
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
int time = bfs(n,k);
printf("%d",time);
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复