题意:输入n,m,求由n到m需要最少步数,n只能加一减一或者乘二。
写的第二道广搜题,发现用队列就是每一种可能读入队尾,然后再从队首一个一个的遍历。
需要做的是判断条件和记录步数。
#include<iostream>
using namespace std;
#include<cstdio>
#include<queue>
#include<cstring>
#define M 200000
int key[M];
int visit[M];
int bfs(int first,int last)
{
int t;
queue<int >q;
memset(visit,false,sizeof(visit));
q.push(first);
key[first] = 0;
visit[first] = true;
while(!q.empty()){
t = q.front();
q.pop();
if(t == last)
return key[t];
if((t - 1) >= 0 && (t - 1) < M && !visit[t - 1]){ //注意括号
key[t - 1] = key[t] + 1;
visit[t - 1] = true;
q.push(t - 1);
}
if((t + 1)>= 0 && (t + 1) < M && !visit[t + 1]){
key[t + 1] = key[t] + 1;
visit[t + 1] = true;
q.push(t + 1);
}
if((t*2) >= 0 && (t*2) < M && !visit[t*2]){
key[t*2] = key[t] + 1;
visit[t*2] = true;
q.push(t*2);
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
printf("%d\n",bfs(n,m));
}
return 0;
}

本文介绍了一道经典的广度优先搜索(BFS)题目——POJ3278,通过C++实现算法解决从初始状态n达到目标状态m所需的最少步骤数问题。该文详细解释了如何使用队列进行状态转移,并通过记录访问标志和步数来避免重复计算。
503

被折叠的 条评论
为什么被折叠?



