Descrip
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
- Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
- Teleporting: FJ can move from any point X to thepoint 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long
does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Ouput
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
分析
- 这是一个找出起点和目标点的最短距离,有两种方法,一个是深度搜索+回溯,用这个需要搜索所有的路径,从所有路劲中找出最优路径,时间复杂度较高。
- 另一种方法是使用广搜,采用数组标记已访问的节点,较优解法
AC Code
//#include<bits/stdc++.h>
#include<iostream>
#include<queue>
using namespace std;
#define MAX 100005
int vis[MAX]={0};
int main(){
int step[MAX]={0};
queue<int>Q;
int n,k;
cin>>n>>k;
Q.push(n);
step[n]=0;
vis[n]=1;
if(n>=k) printf("%d\n",n-k);
else{
while(Q.size()){
int cur = Q.front();
Q.pop();
if(cur == k){
cout<<step[cur];
break;
}else{
if(cur-1>=0&&!vis[cur-1]){
vis[cur-1]=1;
Q.push(cur-1);
step[cur-1] = step[cur]+1;
}
if(cur+1<=MAX&& !vis[cur+1]){
vis[cur+1] = 1;
Q.push(cur+1);
step[cur+1] = step[cur]+1;
}
if(cur*2<=MAX&& !vis[cur*2])
{
vis[cur*2] = 1;
Q.push(cur*2);
step[cur*2] = step[cur]+1;
}
}
}
}
return 0;
}
总结
刚开始我是使用了结构体来模拟节点,结果一直超时,在电脑输入 1 100000,结果电脑差点内存瞬间占满,后台使用数组来模拟节点才能过,以后数据量大的还是乖乖使用数组来模拟节点