去年选拔省赛时候的题目,给了两个素数,问每次修改一位上的数字,修改几次能达到目标数字。最近老是没有
刷题的欲望。浑浑噩噩,这道简单的题目差点就放弃了,确实是搜索中比较简单的题目。每次只改变其中的一位,队
列维护,记录一下距离就可以了。。。下午还有比赛,尽量做吧,无所谓啦。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
#include<queue>
#define MAX 0x7fffffff
using namespace std;
int primer[10005];
int t[5];
int bfs(int n,int m)
{
int vis[10000];
int dis[10000];
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(n);
int temp,tmp,i,j;
dis[n] = 0;
vis[n] = 1;
while(!que.empty())
{
int y = que.front();
que.pop();
if(y == m)
return dis[y];
t[1] = y/1000%10;
t[2] = y/100%10;
t[3] = y/10%10;
t[4] = y%10;
//cout << t[1] << t[2] << t[3] << t[4] << endl;
//cout << dis[y] << endl;
//system("pause");
for(i=1; i<=4; i++)
{
temp = t[i];
for(j=0; j<10; j++)
{
if(j != t[i])
{
t[i] = j;
tmp = t[1]*1000 + t[2]*100 + t[3]*10 + t[4];
if(tmp >= 1000 && !vis[tmp] && !primer[tmp])
{
dis[tmp] = dis[y] + 1;
vis[tmp] = 1;
que.push(tmp);
}
}
}
t[i] = temp;
}
}
return -1;
}
int main()
{
int T,i,j,n,m;
cin >>T;
int en = sqrt(10000);
memset(primer,0,sizeof(primer));
for(i=2; i<=en; i++)
{
if(!primer[i])
for(j=i+i; j<=10000; j+=i)
primer[j] = 1;
}
while(T --)
{
cin >> n >> m;
int ans = bfs(n,m);
if(ans == -1)
cout << "Impossible" << endl;
else
cout << ans << endl;
}
return 0;
}