POJ 3287 ——BFS

code

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

queue <int> q;

int vis[100005];

int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
while(!q.empty())
{
q.pop();
}
memset(vis,0,sizeof(vis));
q.push(n);
vis[n]=1;///开始搜索时的第一步,之后在 vis[tem-1]=vis[tem]+1;
///vis[tem+1]=vis[tem]+1; vis[tem*2]=vis[tem]+1; 这三种情况即为第2步,以此类推第3.4.5...n 直到找到为止
while(!q.empty())
{
int tem=q.front();
q.pop();
if(tem-1>=0&&!vis[tem-1])
{
q.push(tem-1);
vis[tem-1]=vis[tem]+1;
}///后退一步
if(tem+1<=100000&&!vis[tem+1])
{
q.push(tem+1);
vis[tem+1]=vis[tem]+1;
}///前进一步
if(tem*2<=100000&&!vis[tem*2])
{
q.push(tem*2);
vis[tem*2]=vis[tem]+1;
}///跳跃
if(vis[k])
{
break;
}///到达终点
}
printf("%d\n",vis[k]-1);
}
return 0;
}

时间: 2024-12-05 18:11:54

POJ 3287 ——BFS的相关文章

POJ 3287 (基础BFS) Catch That Cow

这是做的第一道BFS,很基础很简单的题目 广度优先搜索算法如下:(用QUEUE)(1) 把初始节点S0放入Open表中:(2) 如果Open表为空,则问题无解,失败退出:(3) 把Open表的第一个节点取出放入Closed表,并记该节点为n:(4) 考察节点n是否为目标节点.若是,则得到问题的解,成功退出:(5) 若节点n不可扩展,则转第(2)步:(6) 扩展节点n,将其不在Closed表和Open表中的子节点(判重)放入Open表的尾部,并为每一个子节点设置指向父节点的指针(或记录节点的层次)

POJ Multiple (BFS,同余定理)

http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6164   Accepted: 1339 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM

poj 2243 bfs 利用 结构体中的step成员保存步数 ,STL的队列

//BFS #include <iostream> #include <queue> using namespace std; bool used[8][8]; int move[8][2]={1,2, -1,2, -2,1, -2,-1, -1,-2, 1,-2, 2,-1, 2,1}; struct position { int i,j; int step; position(int a,int b,int c) { i=a; j=b; step=c; } }; int mai

poj 1915 BFS 利用 pre 计算步数------------------路径

// BFS #include <stdio.h> #include <string.h> int visited[301][301]; // visited 已经访问过了 int dic[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; int head,end,n,ex,ey,sx,sy; struct quene { int x,y,pre; // pre 前一个结点 }q[100000]; vo

POJ 3414-Pots(BFS)

题目地址:POJ 3414 题意:给你a,b两个容器的容量,六种操作方法,问最少多少次可以使其中一个容器里的水达到体积c,如果不能的话则输出impossible. 思路:一共有6种操作方法,0:倒满a,1:倒满b,2:把a里的水倒向b(两种情况b倒满a有剩余或者a倒完),3:把b里的水倒向a(类似2的两种情况),4:把a倒空,5:把b倒空.然后用vis[i][j]记录当a的容量为i,b的容量为j时走了多少步,op[i][j][k]记录当a的容量为i,b的容量为j时用的第k步操作是谁.然后就是乱搞

POJ - 3026(BFS+最小生成树.krustal)

题目: 题目链接: http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17462   Accepted: 5631 Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The

POJ 3126 BFS

题意 将一个四位的素数,变为另一个四位的素数.每次只能换一位上的数字,不能存在前导0,且中间过程中,换掉一位数字后的数也都是素数. 问最少变换的次数 分析 bfs即可 代码 1 /* When all else is lost the future still remains. */ 2 /* You can be the greatest */ 3 #define rep(X,Y,Z) for(int X=(Y);X<(Z);X++) 4 #define drep(X,Y,Z) for(int

POJ 2935 BFS

给出6*6的矩阵,起点,终点,一共三堵墙,墙不会相交. 求起点到终点的最少步,保证有解 对每次移动判断相对应的是否有墙即可 #include "stdio.h" #include "string.h" #include "queue" using namespace std; const int dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} }; int wall[10][10][10][10]; int s_x,s

poj 3278(bfs)

一条线上bfs搜就行 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int maxn=100000+100; int n,k; bool vis[maxn*2+100]; struct note { int x; int cnt; }; int bfs