移动 II
| 移动 II | ||||||
|
||||||
| Description | ||||||
|
在坐标轴[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 17 5 18 3 499 |
||||||
| Sample Output | ||||||
step back jump jump step forward jump step back jump step forward jump jump jump step back jump jump step forward jump jump step back #include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<string>
#include<queue>
#include <stack>
using namespace std;
#pragma warning(disable : 4996)
const int MAXN = 600;
typedef struct Point
{
int x;
int cnt;
int y; //1 step back 2 step forward 3 jump
}Point;
queue<Point>Q;
bool visited[MAXN];
Point path[1000000];
void bfs(int x, int y)
{
while (!Q.empty())
{
Q.pop();
}
Point pre, next;
pre.x = x;
pre.cnt = 0;
pre.y = -1;
visited[pre.x] = true;
Q.push(pre);
while (!Q.empty())
{
pre = Q.front();
Q.pop();
if(pre.x == y)
{
return;
}
next.x = pre.x - 1;
if(!visited[next.x] && next.x >= 0)
{
next.cnt = pre.cnt + 1;
next.y = 1;
path[next.x] = pre;
visited[next.x] = true;
Q.push(next);
}
next.x = pre.x + 1;
if(!visited[next.x] && next.x >= 0 && next.x <= MAXN)
{
next.cnt = pre.cnt + 1;
next.y = 2;
path[next.x] = pre;
visited[next.x] = true;
Q.push(next);
}
next.x = pre.x * 2;
if(!visited[next.x] && next.x >= 0 && next.x <= MAXN)
{
next.cnt = pre.cnt + 1;
next.y = 3;
path[next.x] = pre;
visited[next.x] = true;
Q.push(next);
}
}
}
void print(int n)
{
Point pre;
pre = path[n];
if(pre.y != -1)
{
print(pre.x);
}
if(pre.y == 1)
{
printf("step back\n");
}
else if(pre.y == 2)
{
printf("step forward\n");
}
else if(pre.y == 3)
{
printf("jump\n");
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
if(n == m)
{
printf("\n");
continue;
}
else if (n > m)
{
for (int i = 1; i <= n - m; i++)
{
printf("step back\n");
}
}
else
{
memset(visited, false, sizeof(visited));
bfs(n, m);
print(m);
if(path[m].x == m + 1)
{
printf("step back\n");
}
else if(path[m].x == m - 1)
{
printf("step forward\n");
}
else if(path[m].x * 2 == m)
{
printf("jump\n");
}
}
printf("\n");
}
return 0;
} |
Keep it simple!



浙公网安备 33010602011771号