Description
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
大水题,40入口的BFS,剪枝后远远没有40入口。
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;
const int maxp = 10010;
bool isPrime[maxp];
int a, b;
void init()
{
fill(isPrime, isPrime+maxp, true);
for (int i = 2; i < maxp; ++i)
if (isPrime[i])
for (int j = i*i; j < maxp; j += i)
isPrime[j] = false;
}
int bfs()
{
int vis[maxp];
memset(vis, -1, sizeof(vis));
queue<int> q;
q.push(a);
vis[a] = 0;
while (!q.empty())
{
int num = q.front();
q.pop();
if (num == b)
return vis[num];
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 10; ++j)
if (i != 3 || j)
{
int t = (int)(pow(10, i) + 0.5);
int c = num - ((num / t) % 10) * t + j * t;
if (isPrime[c] && vis[c] == -1)
{
q.push(c);
vis[c] = vis[num] + 1;
}
}
}
return -1;
}
int main()
{
init();
int T;
cin >> T;
while (T--)
{
scanf("%d%d", &a, &b);
int ans = bfs();
if (ans == -1)
printf("Impossible\n");
else
printf("%d\n", bfs());
}
return 0;
}
版权声明:本文为博主原创文章,转载请注明出处。
原文地址:http://blog.csdn.net/god_weiyang/article/details/47833727