Two Buttons |
---|
题意: 每次只能将一个数乘以2,或加一,问从n得到m的最小步数是多少。
题解: 看到题目我第一反应就是BFS,几乎是无脑就写完了(加了一个剪枝),然后我才发现大家都是当作思维题或者是简单模拟的,好吧可能是我草率了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
int n, m;
int vis[N << 1];
struct node{ int id, cnt;};
void BFS() {
queue<node> Q;
Q.push({n, 0});
while(!Q.empty()) {
node u = Q.front(); Q.pop();
if(u.id == m) {
printf("%d\n", u.cnt);
return ;
}
if(vis[u.id]) continue;
if(u.id <= 0) continue;
if(u.id > N) continue;
vis[u.id] = 1;
if(!vis[u.id * 2]) Q.push({u.id * 2, u.cnt + 1});
if(!vis[u.id - 1]) Q.push({u.id - 1, u.cnt + 1});
}
}
int main() {
scanf("%d%d", &n, &m);
BFS();
return 0;
}