STEP 0 前置知识
如何判断质数
bool is_prime(long long x){
if(x == 1) return false;
if(x == 2) return true;
if(x % 2 == 0) return false;
for(long long i = 3;i * i <= x; i ++)//直接筛从 3 开始的奇数
if(x % i == 0)
return false;
return true;
}
STEP 1 如何 dfs
通过分情况讨论标记是否可行,然后用 数组储存,详见代码中的注释。
void dfs(long long x,long long y,int t){
if(boo) return; //可行就直接跳出DFS
if(is_prime(abs(x-y))){
boo=true;//标记
printf("%d\n",t + 1);//输出答案
printf("%lld ",a);
for(int i=1;i<t;i++) printf("%lld ",ans[i]) ;
printf("%lld ", b);
return;
}
if(x!=2)//判断为两个奇数(因为质数中的偶数只有 2 ,所以只要判断它是否为 2 即可
for(int i=1;i<=3;i++){
if(i==1&&is_prime(x-2)){ //方案 1 :将其中一个奇数变为 2
ans[t]=2;
dfs(2,y,t+1);
}
if(i==2&&is_prime(x-2)){ //方案 2 :将其中一个奇数 -2 ,使两个奇数差 2
ans[t]=x-2;
dfs(x-2,y,t+1);
}
if(i==3&&is_prime(x+2)){//方案 3 :将其中一个奇数 +2 ,使两个奇数差 2
ans[t]=x+2;
dfs(x+2,y,t+1);
}
}
else//一奇一偶的情况
if(is_prime(y+2)){
ans[t]=y+2;
dfs(y+2,y,t+1);
}
return;
}
STEP 2 AC Code
#include<bits/stdc++.h>
using namespace std;
long long ans[50];
long long a,b,n=2;
bool boo;
bool is_prime(long long x){
if(x == 1) return false;
if(x == 2) return true;
if(x % 2 == 0) return false;
for(long long i = 3;i * i <= x; i ++)
if(x % i == 0)
return false;
return true;
}
void dfs(long long x,long long y,int t){
if(boo) return;
if(is_prime(abs(x-y))){
printf("%d\n",t + 1);
printf("%lld ",a);
for(int i=1;i<t;i++) printf("%lld ",ans[i]) ;
printf("%lld ", b);
boo=true;
return;
}
if(x!=2)
for(int i=1;i<=3;i++){
if(i==1&&is_prime(x-2)){
ans[t]=2;
dfs(2,y,t+1);
}
if(i==2&&is_prime(x-2)){
ans[t]=x-2;
dfs(x-2,y,t+1);
}
if(i==3&&is_prime(x+2)){
ans[t]=x+2;
dfs(x+2,y,t+1);
}
}
else
if(is_prime(y+2)){
ans[t]=y+2;
dfs(y+2,y,t+1);
}
return;
}
int main(){
scanf("%lld%lld",&a,&b);
dfs(a,b,1);
if(!boo) puts("-1");
return 0;
}