//广度优先搜索 #include<iostream> #include<queue> using namespace std; const int SIZE = 10000; bool prime[SIZE]; int step[SIZE];//树深度标志 int base[4] = {1,10,100,1000}; int main() { for(int i = 0; i < SIZE; i++) prime[i] = true;//生成素数表,方便判断 for(int i = 2; i < SIZE; i++) { if(prime[i]) { for(int j = 2; i*j < SIZE; j++) prime[i*j] = false; } } int t,a,b,d[4]; cin >> t; while(t--) { cin >> a >> b; memset(step,0,sizeof(step)); queue<int> path;//队列 path.push(a); step[a] = 1; while(!path.empty()) { int ori = path.front(); if(ori == b)break; path.pop(); //分离位数 d[0] = ori%10; d[1] = ori%100/10; d[2] = ori%1000/100; d[3] = ori/1000; int newnum;//产生的新数 for(int i = 0; i < 10; i ++) { newnum = ori - d[3]*1000 + i*1000;//枚举符合条件的数 if(i != 0 && prime[newnum] && !step[newnum])//是质数且未假如队列 { step[newnum] = step[ori] + 1; path.push(newnum); } for(int k = 0; k < 3; k++) { newnum = ori - d[k]*base[k] + i*base[k]; if(prime[newnum] && !step[newnum]) { step[newnum] = step[ori] + 1;//子节点在父亲节点的基础上深度增加1 path.push(newnum); //假如队列 } } } } cout << step[b] - 1 << endl; } return 0; }