您的位置:首页 > 编程语言

网易笔试编程-饥饿的小易

2016-11-30 17:05 549 查看
题目描述:

小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。

输入描述:

输入一个初始位置x_0,范围在1到1,000,000,006

输出描述:

输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1

输入例子:

125000000

输出例子:

1

算法分析:

利用队列实现广度搜索,遍历所有的可能性。利用容器map来映射小易所在的位置和到该位置小易所用的神秘力量次数。为了保证map容器容量的有限性,小易所在的位置用距离总数对1,000,000,000,007的余数来表示。因为位置用余数表示,所以必然会出现重复,所以在编码的时候,需要将重复的位置去除,去除办法就是在得到新位置后先判断该位置是否已在map容器中,若没有,才将该位置插入map容器中(否则会构成环路)。

算法描述:

初始化map容器,初始化队列。将下标为初始位置和值为0的健值对插入容器map中,将初始位置压入到队列中,开始循环,循环继续的条件为队列不为空。在循环体内,首先从队列头取出小易所在的位置,判断小易所在的位置是不是目标位置,如果是,break跳出循环,如果不是,再判断小易到当前位置所用的神秘力量次数是否到达上限,如果到达,continue跳出本次循环,进入下一次循环(因为小易在该位置已经用光了神秘力量,不能再用了,进入下一次循环,看看其他位置的情况)。如果小易这次还能用神秘力量,那就在当前位置使用神秘力量1(4*X+3),再将结果对1,000,000,000,007取余,得到小易通过神秘力量1移动到的位置,判断该位置是否在map容器中存在,如果不存在,将当前位置的神秘力量次数加一赋予通过神秘力量1移动到的下一个位置,并将该位置压入队列中。如果存在,抛弃使用神秘力量1。同理,如果在当前位置使用神秘力量2(8 * X + 7),再经过取余,得到了下一个位置,判断该位置是否在map容器中存在,若不存在,将当前位置的总神秘力量次数加一赋予下一个位置,并将该位置压入队列中。如果存在,就抛弃使用神秘力量2,直到循环截止。从循环中出来之后,需要判断队列是否为空,如果为空,则说明试遍了所有位置都没有找到,则输出-1,否则说明循环是从break中退出的,到达目标位置所使用的总神秘力量次数存储在map容器键为0的位置,输出即可。

#include <iostream>
#include <map>
#include <queue>

#define MOD 1000000007
#define MAX 100000

using namespace std;

typedef long long ll;

int main(void)
{
ll x_0;
cin >> x_0;
map<ll, int> dist_cnt;
queue<ll> q;
q.push(x_0);
dist_cnt[x_0] = 0;
ll finalStep;
while(!q.empty())
{
ll curLocal = q.front();
q.pop();
if (curLocal == 0)
{
finalStep = curLocal;
break;
}
if (dist_cnt[curLocal] > MAX) continue;
ll nextLocal = (4 * curLocal + 3) % MOD;
if (dist_cnt.find(nextLocal) == dist_cnt.end())
{
dist_cnt[nextLocal] = dist_cnt[curLocal] + 1;
q.push(nextLocal);
}
nextLocal = (8 * curLocal + 7) % MOD;
if (dist_cnt.find(nextLocal) == dist_cnt.end())
{
dist_cnt[nextLocal] = dist_cnt[curLocal] + 1;
q.push(nextLocal);
}
}
int steps = q.empty() ? -1 : dist_cnt[finalStep];
cout << steps << endl;
return 0;
}


若有不对之处,敬请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息