http://poj.org/problem?id=3278

(1)稍微考虑就可以知道,要用广搜,广搜次数也不需要控制(因为一定会在远小于10万次以内找到)。

(2)有一次RE,*2时没有判断是否超出10万。

具体代码:

View Code
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n, m;
struct node
{
    int n, t;
}e, s;
int mark[100100];
void bfs()
{
    int i, j, k;
    memset(mark, 0, sizeof(mark));
    mark[n]=1;
    queue<node>q;
    while(!q.empty()) q.pop();
    e.n=n, e.t=0;
    q.push(e);
    while(!q.empty())
    {
        e=q.front();
        q.pop();
        if(e.n==m) {printf("%d\n", e.t); return ;}
        s.n=e.n-1, s.t=e.t+1;
        if(s.n>=0&&!mark[s.n]) {q.push(s);mark[s.n]=1;}
        s.n=e.n+1, s.t=e.t+1;
        if(!mark[s.n]) {q.push(s);mark[s.n]=1;}
        s.n=e.n*2;
        if(s.n<100100&&!mark[s.n]) {q.push(s);mark[s.n]=1;}
    }
}
int main()
{
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        bfs();
    }
    return 0;
}