hrust OJ 1316 移动II

来源:互联网 发布:c语言进程的创建 编辑:程序博客网 时间:2024/05/01 05:44

移动 IITime Limit: 1000 MSMemory Limit: 65536 KTotal Submit: 107(29 users)Total Accepted: 59(28 users)Rating: Special Judge: NoDescription

在坐标轴[0,500]上存在两点A,B。

点A可以多次移动,每次移动需要遵循如下规则:

1.向后移动一步。

2.向前移动一步。

3.跳到当前坐标*2的位置上。


要求:利用宽搜算法编程求解从A移动到B的步数最少的方案,为使答案统一,要求搜索按照规则1、2、3的顺序进行。

Input

输入包含多组测试用例。

每组测试用例要求输入两个整数A,B。

Output

按要求输出步数最少的方案。

向后走输出"step back"。

向前走输出"step forward"。

跳跃输出"jump"。

对于每组结果需要追加一个空行。

Sample Input
5 175 183 499
Sample Output
step backjumpjumpstep forwardjumpstep backjumpstep forwardjumpjumpjumpstep backjumpjumpstep forwardjumpjumpstep back
//广搜+路径记录

#include<iostream>#include<map>#include<queue>#include<string.h>using namespace std;int mark[505];int root[505];int A, B;void bfs(){    queue<int>J;    int temp;    J.push(A);    mark[A]=1;    while(J.size())    {        temp=J.size();        while(temp--)        {            int next=J.front();            if(next==B) return ;            if(next-1<=500&&next-1>=0&&mark[next-1]==0)            {                root[next-1]=next;                J.push(next-1);                mark[next-1]=1;            }            if(next+1>=0&&next+1<=500&&mark[next+1]==0)            {                root[next+1]=next;                J.push(next+1);                mark[next+1]=1;            }            if(2*next>=0&&2*next<=500&&mark[2*next]==0)            {                root[2*next]=next;                J.push(2*next);                mark[2*next]=1;            }            J.pop();        }    }}void print(int i){    if(i==A) return ;    print(root[i]);    if(i==root[i]-1) cout << "step back"  << endl;    else if(i==root[i]+1) cout << "step forward" << endl;    else  cout << "jump" << endl;}int main(){      while(cin >> A >> B)      {          memset(mark, 0, sizeof(mark));          bfs();          print(B);          cout << endl;      }    return 0;}



原创粉丝点击