題目大意:
給你兩個四位的素數s和t,要求每次改變一個數字,使得改變後的數字也為素數,求s變化到t的最少變化次數。
思路:
首先求出所有4位素數。
對於兩個素數之間,如果只相差一個數字,那麼就建立圖,(雙向)
最後求最短路即可(可以SPFA也可以BFS)
#include#include #include #include using namespace std; const int MAXN=10000+10; const int INF=0x3ffffff; bool isprimer[MAXN]; int primer[MAXN],num; int head[MAXN],len; struct edge { int to,next; }e[MAXN*10]; void add(int from,int to) { e[len].to=to; e[len].next=head[from]; head[from]=len++; } //判斷兩個數僅有一個數字不同 bool judge(char *x,char *y) { int cnt=0; for(int i=0;i<4;i++) if(x[i]==y[i]) cnt++; return cnt==3; } int dis[MAXN]; bool vis[MAXN]; int spfa(int s,int t) { for(int i=1000;i<=10000;i++) { dis[i]=INF; vis[i]=0; } dis[s]=0; vis[s]=true; queue q; q.push(s); while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=head[cur];i!=-1;i=e[i].next) { int to=e[i].to; if(dis[cur]+ 1 < dis[to]) { dis[to]=dis[cur]+1; if(!vis[to]) q.push(to); } } } return dis[t]; } int main() { memset(head,-1,sizeof(head)); num=len=0; for(int i=2;i*i