求从一个点到另一个点的最快方法,对于每个点下一步有三种选择:
1. + 1
2. - 1
3. 当前坐标*2
并且三种选择都花费1秒。
刚开始就想到了是BFS求最短路径,但是没想到要标记。不标记已搜过的点坐标的话确实是会TLE的。另外还有一个,如果起点大于重点的话,也就是只有不断-1可以选择的话,可以直接输出两者的差值,但也可以直接DFS做,两者相差十几ms,并不是很大区别。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int vis[100005];
struct Node
{
int pos, steps;
Node(int a, int b)
{
pos = a;
steps = b;
}
};
queue<Node> q;
void bfs(int s, int e)
{
Node a(s, 0);
q.push(a);
vis[s] = 1;
while (!q.empty())
{
Node b = q.front();
q.pop();
if (b.pos == e)
{
printf("%d\n", b.steps);
break;
}
if (b.pos + 1 <= 100000 && vis[b.pos + 1] == 0)
{
q.push(Node(b.pos + 1, b.steps + 1));
vis[b.pos + 1] = 1;
}
if (b.pos - 1 >= 0 && vis[b.pos - 1] == 0)
{
q.push(Node(b.pos - 1, b.steps + 1));
vis[b.pos - 1] = 1;
}
if (b.pos * 2 <= 100000 && vis[b.pos * 2] == 0)
{
vis[b.pos * 2] = 1;
q.push(Node(b.pos * 2, b.steps + 1));
}
}
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
memset(vis, 0, sizeof(vis));
bfs(a, b);
}