用三維迷宮廣搜問題,POJ 3126 Prime Path 簡單廣搜(BFS)

 2023-12-06 阅读 29 评论 0

摘要:題意:一個四位數的質數,每次只能變換一個數字,而且變換后的數也要為質數。給出兩個四位數的質數,輸出第一個數變換為第二個數的最少步驟。 利用廣搜就能很快解決問題了。還有一個要注意的地方,千位要大于0。例如0373這個數不符合要求。 #i

題意:一個四位數的質數,每次只能變換一個數字,而且變換后的數也要為質數。給出兩個四位數的質數,輸出第一個數變換為第二個數的最少步驟。

利用廣搜就能很快解決問題了。還有一個要注意的地方,千位要大于0。例如0373這個數不符合要求。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <map>
using namespace std;struct Struct
{int num;int step;
};
bool Prime(int a) //判斷是否為質數
{for(int i=2;i<=sqrt(a);i++)if(a%i==0)return false;return true;
}
int bfs(int a,int b)
{queue<Struct>q;map<int,bool>m; //用map來標記數字是否被訪問過
    Struct temp,next;temp.num=a;temp.step=0;m[a]=true;q.push(temp);while(!q.empty()){temp=q.front();if(temp.num==b)return temp.step;q.pop();for(int i=1;i<10;i++) //變換千位
        {next=temp;next.num=next.num%1000+i*1000;if(!m[next.num] && Prime(next.num)){m[next.num]=true;next.step++;q.push(next);}}int x=100;for(int i=0;i<3;i++) //變換百位,十位,個位
        {for(int j=0;j<10;j++){next=temp;next.num=next.num%x+j*x+next.num/(x*10)*(x*10);if(!m[next.num] && Prime(next.num)){m[next.num]=true;next.step++;q.push(next);}}x=x/10;}}return -1;
}
int main()
{//freopen("in.txt","r",stdin);int n;scanf("%d",&n);while(n--){int a,b;scanf("%d%d",&a,&b);int ans=bfs(a,b);if(ans!=-1)printf("%d\n",ans);elseprintf("Impossible\n");}return 0;
}

?

用三維迷宮廣搜問題,轉載于:https://www.cnblogs.com/pach/p/5779016.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/189868.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息