POJ3278 BFS
2015-12-20 21:39
260 查看
题意:
输入两个数n和k,n一步可以-1或+1或*2,把n经过一系列变化变成k,计算最小的步数
要点:
这是我做的第一道BFS题,BFS的特点就是往四周延生,一般同一层次的状态是相同的,用树来举例就是一层层向下,先确保一层完成再往下,用迷宫举例就是如果第一步往上第二步往右,它的状态和第一步往左,第二步往上是相同的,即每一步构成一个集合。一般BFS都是用队列做的
这道题还是很好理解的,总共可以向三个方向BFS搜索,因为BFS都是同一层次比较,所以只要第一个出现等于k,它的步数肯定是最少的。
代码如下:
输入两个数n和k,n一步可以-1或+1或*2,把n经过一系列变化变成k,计算最小的步数
要点:
这是我做的第一道BFS题,BFS的特点就是往四周延生,一般同一层次的状态是相同的,用树来举例就是一层层向下,先确保一层完成再往下,用迷宫举例就是如果第一步往上第二步往右,它的状态和第一步往左,第二步往上是相同的,即每一步构成一个集合。一般BFS都是用队列做的
这道题还是很好理解的,总共可以向三个方向BFS搜索,因为BFS都是同一层次比较,所以只要第一个出现等于k,它的步数肯定是最少的。
代码如下:
#include <cstdio> #include <queue> using namespace std; const int maxn = 100005; queue<int> que;//建立一个从小到大的队列 int step[maxn];//记录步数 bool vis[maxn]; int n, k; int nex, head;//next好像是库中的变量不能用 int bfs() { que.push(n); vis = false; step = 0; while (!que.empty()) { head = que.front(); que.pop(); for (int i = 0; i < 3; i++) { if (i == 0) nex = head - 1; else if (i == 1) nex = head + 1; else nex = head * 2; if (nex > maxn || nex < 0) continue; //越界直接脱出 if (vis[nex]) { que.push(nex); step[nex] = step[head]+1;//这里还不能用++,为什么? vis[nex] = false; } if (nex == k) //因为是广搜,同一层次步数是相同的,先到k的先输出就行了 return step[nex]; } } return -1; } int main() { scanf("%d%d", &n, &k); memset(vis, true, sizeof(vis)); if (n >= k)//大于只能朝后走 printf("%d\n", n - k); else printf("%d\n", bfs()); return 0; }
相关文章推荐
- 类成员初始化
- Java中异常处理和设计
- Java按位操作符
- 如何让app适应不同分辨率(转)
- 精确乘幂
- 开源的魅力:利用CMake编译Opencv源代码
- mysql用户管理
- js页面之间传参2
- gridview--基本的gridview
- boa安装
- 源码安装lua
- 详解WebApp与Native App的区别(转)
- 五、在myeclipse中查询与添加索引实例
- DZNEmptyDataSet
- Android中Parcelable接口用法
- Android 怎么录制视频
- 软件工程总结
- html知识小结
- Android中Activity启动模式详解(转)
- JavaScript 浮点数及运算精度调整总结,浮点数计算不准确怎么办