从昏迷中醒来,小明发现自己被关在X星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着“F”和“B”。
小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。 按F,会前进97米。按B会后退127米。 透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。 或许,通过多次操作F和B可以办到。
矿车上的动力已经不太足,黄色的警示灯在默默闪烁... 每次进行 F 或 B 操作都会消耗一定的能量。 小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。
请填写为了达成目标,最少需要操作的次数。
注意,需要提交的是一个整数,不要填写任何无关内容(比如:解释说明等)
答案:(50分)
97x-127y=1,显然x>y,可以二重循环边界设大一点,也可以bfs+标记,根据前面的方程,扩展欧几里得也可以。
代码:
#include <iostream> #include <queue> #include <map> using namespace std; typedef pair<int,int> pa; int main() { queue<pa> q; map<int,bool> mp; q.push(pa(0,0)); while(!q.empty()) { if(q.front().first == 1) { cout<<q.front().second; break; } if(!mp[q.front().first]) { q.push(pa(q.front().first + 97,q.front().second + 1)); q.push(pa(q.front().first - 127,q.front().second + 1)); mp[q.front().first] = true; } q.pop(); } }
#include <iostream> #include <queue> #include <map> using namespace std; void exgcd(int a,int b,int &x,int &y) { if(b == 0) { x = 1; y = 0; return; } exgcd(b,a % b,y,x); y -= x * (a / b); } int main() { int x,y; exgcd(97,-127,x,y); cout<<x + y; }
如果觉得有帮助,点个推荐啦~