POJ - 3126 - Prime Path
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 3126 - Prime Path相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/POJ-3126
题目大意:有两个四位数门牌号,先要从第一个门牌号到达第二个门牌号,中间每次只能改变门牌号的其中一个数字,且只能经过素数,问最少
要经过多少次移动到达终点。
题目分析:简单的BFS,先素数打表然后进行BFS即可。
给出代码:
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <string> using namespace std; bool is_prime[10000+10]; int mark[10000+10]; int a,b; struct num { int x; int step; num(int xx=0,int steps=0) { x=xx; step=steps; } }; void init() { memset(is_prime,1,sizeof(is_prime)); is_prime[0]=0; is_prime[1]=0; for(int i=2;i<=10000;i++) { if(is_prime[i]) { for(int j=i+i;j<=10000;j+=i) { is_prime[j]=0; } } } } int bfs() { queue<num> q; q.push(num(a,0)); mark[a]=0; while(!q.empty()) { num c=q.front(); q.pop(); if(c.x==b) return c.step; else { int n=c.x; int a1=n/1000; n=n%1000; int a2=n/100; n=n%100; int a3=n/10; int a4=n%10; // cout<<a1*1000+a2*100+a3*10+a4<<endl; int h=c.x; for(int i=1;i<=9;i++) { int v=i*1000+a2*100+a3*10+a4; if(is_prime[v]&&v!=h&&mark[v]) { q.push(num(v,c.step+1)); mark[v]=0; } } for(int i=0;i<=9;i++) { int v=a1*1000+i*100+a3*10+a4; if(is_prime[v]&&v!=h&&mark[v]) { q.push(num(v,c.step+1)); mark[v]=0; } } for(int i=0;i<=9;i++) { int v=a1*1000+a2*100+i*10+a4; if(is_prime[v]&&v!=h&&mark[v]) { q.push(num(v,c.step+1)); mark[v]=0; } } for(int i=0;i<=9;i++) { int v=a1*1000+a2*100+a3*10+i; if(is_prime[v]&&v!=h&&mark[v]) { q.push(num(v,c.step+1)); mark[v]=0; } } } } return -1; } int main() { init(); int T; cin>>T; while(T--) { memset(mark,1,sizeof(mark)); //int a,b; cin>>a>>b; int t=bfs(); cout<<t<<endl; } return 0; }
以上是关于POJ - 3126 - Prime Path的主要内容,如果未能解决你的问题,请参考以下文章