Problem: 3278 | User: nasta | |
Memory: 1276K | Time: 32MS | |
Language: G++ | Result: Accepted |
题目给出两个数a b,求由a经过加一,减一或乘二经过最小的步数n到b,输出n,例如:对于a=5,b=17 有:5-10-9-18-17, n=4
思路:
简单BFS
居然因为时间是用char开的WA了N次、、、够水的
#include <iostream>
#include <queue>
#define N 100001
using namespace std;
int t[N];
bool s[N];
int bfs(int n, int k)
{
queue<int> q;
for(int i=0; i < N; ++i)
{
t[i] = -1;
s[i] = 0;
}
s[n] = 1;
t[n] = 0;
q.push(n);
while(!q.empty())
{
int u = q.front();q.pop();
//cout << "c: " << u << "\tt: " << (int)t[u] << endl;
if(u == k)
return t[u];
int m[3] = {u*2, u-1, u+1};
for(int i=0; i < 3; ++i)
{
const int &next = m[i];
if(next>=0 && next <= N+1 && !s[next])
{
q.push(next);
s[next] = true;
t[next] = t[u] + 1;
}
}
}
return -1;
}
int main()
{
int n, k;
while(cin >> n >> k)
{
cout << bfs(n, k) << endl;
}
return 0;
}