基本的BFS,画出解答树就知道该怎么办了,就是要注意数据量比较大, 要进行剪枝操作,不然会超时。
给定两个整数n和k
通过 n+1或n-1 或n*2 这3种操作,使得n==k
输出最少的操作次数
#include<cstdio>
#include<cstring>
const int Maxsize = 200030;
using namespace std;
typedef struct
{
int data,cnt;
}node;
node queue[Maxsize];
bool visit[Maxsize];
int main()
{
int n,m;
void bfs(int n,int m);
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(queue,0,sizeof(queue));
memset(visit,false,sizeof(visit));
bfs(n,m);
}
return 0;
}
void bfs(int n,int m)
{
node pre;
int rear = 0,front = 0;
queue[rear].data = n;
queue[rear++].cnt = 0;
visit[n] = true;
while(front < rear)
{
pre = queue[front++];
if(pre.data == m)
{
printf("%d\n",pre.cnt);
return;
}
if(pre.data-1 >= 0 && !visit[pre.data - 1]) //pre.data - 1 >= 0 剪枝操作
{
visit[pre.data - 1] = true;
queue[rear].data = pre.data - 1;
queue[rear++].cnt = pre.cnt+1;
}
if(pre.data <= m && !visit[pre.data + 1]) //pre.data <=m 剪枝操作。
{
visit[pre.data + 1] = true;
queue[rear].data = pre.data + 1;
queue[rear++].cnt = pre.cnt+1;
}
if(pre.data <= m && !visit[pre.data*2])
{
visit[pre.data*2] = true;
queue[rear].data = pre.data * 2;
queue[rear++].cnt = pre.cnt+1;
}
}
}
//bfs需要进行剪枝操作。
//用visit图来保存当前数值是否被访问过,若再没有到达结果出现被访问的值,则一定不是最短的情况。(类似记忆化搜索的常用手段)