Prime Path bfs搞定
Posted 给杰瑞一块奶酪~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prime Path bfs搞定相关的知识,希望对你有一定的参考价值。
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices.
— It is a matter of security to change such things every now and then, to keep the enemy in the dark.
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know!
— I know, so therefore your new number 8179 is also a prime.
You will just have to paste four new digits over the four old ones on
your office door.
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime!
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds.
— Correct! So I must invent a scheme for going from 1033 to
8179 by a path of prime numbers where only one digit is changed from one
prime to the next prime.
Now, the minister of finance, who had been eavesdropping, intervened.
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound.
— Hmm, in that case I need a computer program to minimize the cost. You don‘t know some very cheap software gurus, do you?
— In fact, I do. You see, there is this programming contest
going on... Help the prime minister to find the cheapest prime path
between any two given four-digit primes! The first digit must be
nonzero, of course. Here is a solution in the case above.
1033
1733
3733
3739
3779
8779
8179
The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
Input
3 1033 8179 1373 8017 1033 1033Sample Output
6 7 0
一看这道题就想到bfs
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <cmath> #include <string> #include <queue> using namespace std; class que { public: int d; int times; }temp; int vis[9000],sta,time,num; int main() { int prime[10000]={1,1,0,0}; for(int i=2;i<=9999;i++) { if(!prime[i]) { for(int j=i;j*i<=9999;j++) prime[i*j]=1; } } int T,a,b; queue<que>q; cin>>T; while(T--) { cin>>a>>b; int flag=0; memset(vis,0,sizeof(vis)); while(!q.empty())q.pop(); temp.d=a,temp.times=0; q.push(temp); vis[a-1000]=1; if(!prime[a]&&!prime[b]) while(!q.empty()) { if(q.front().d==b) { flag=1; cout<<q.front().times<<endl; break; } sta=q.front().d,time=q.front().times; for(int i=1000;i>0;i/=10) { for(int j=0;j<10;j++) { num=sta-sta/i%10*i+i*j; if(num<1000||prime[num]||vis[num-1000])continue; vis[num-1000]=1; temp.d=num,temp.times=time+1; q.push(temp); } } q.pop(); } if(!flag)cout<<"impossible"<<endl; } }
以上是关于Prime Path bfs搞定的主要内容,如果未能解决你的问题,请参考以下文章