搜索--07

来源:互联网 发布:成都 知乎 编辑:程序博客网 时间:2024/06/04 17:59

题目大概:

一个人捉一头牛,他们在一条直线上,人和牛分别在一个位置上n,m,牛不动,人可以左走1,右走1,右走2*n,问最少几步人可以捉到牛。

思路:

用广搜。

用队列存数据,每次都把该坐标下的三种走法存入队列,每次从队头取出数据判断是否捉到牛。

这里也可以把走的步数也存入队列,每次取出并删除。

代码:

#include <iostream>#include <queue>#include <cstring>#include <algorithm>using namespace std;queue<int>a;int n,k,j=0;int biao[100000];int  dfs(){ a.push(n);a.push(0);biao[n]=1;    while(!a.empty())    {int c=a.front();        a.pop();j=a.front();a.pop();        if(c==k)return 0;       if(c+1<=100000&&!biao[c+1]){biao[c+1]=1;        a.push(c+1);a.push(j+1);}        if(c-1>=0&&!biao[c-1]){biao[c-1]=1;        a.push(c-1);a.push(j+1);}        if(2*c<=100000&&!biao[2*c]){biao[2*c]=1;        a.push(2*c);a.push(j+1);}    }return 0;}int main(){cin>>n>>k;memset(biao,0,sizeof(biao));dfs();cout<<j;  return 0;}


0 0