• HDOJ-三部曲一(搜索、数学)-1008-Prime Path


    Prime Path

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 15   Accepted Submission(s) : 13
    Problem Description
    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
    One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).
     
    Output
    One line for each case, either with a number stating the minimal cost or containing the word Impossible.
     
    Sample Input
    3
    1033 8179
    1373 8017
    1033 1033
     
    Sample Output
    6
    7
    0
     
    Source
    PKU
     
     
     
     
    又是一道BFS水题。。。。
     
     
     
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    
    bool num[10000]={false},f[10000];
    int n1,n2;
    int que[20000],step[10000],m[10000];   //数组m表示上次变得位数。如果上次变了一位这次还变同一位就没有意义了
    void judgeprime()                      //打标法判断1000到9999各个数是否是素数
    {
    	for(int i=1000;i<10000;i++)
    	{
    		for(int j=2;j<=sqrt(i);j++)
    		{
    			if(i%j==0)
    			{	
    				num[i]=false;
    				break;
    			}
    			else
    				num[i]=true;
    		}
    	}
    }
    
    int BFS()
    {
    	int front=0,rear=1;
    	step[front]=0;
    	que[0]=n1;
    	f[n1]=true;
    	if(que[front]==n2)
    		return step[front];
    	while(front<rear)
    	{
    		int t=que[front]/10*10;         //变个位
    		for(int i=0;i<=9;i++)
    		{
    			if(num[t]&&!f[t]&&m[front]!=1)
    			{
    				que[rear]=t;
    				f[t]=true;
    				m[rear]=1;
    				step[rear]=step[front]+1;
    				if(que[rear]==n2)
    					return step[rear];
    				rear++;
    			}
    			t++;
    		}
    		t=que[front]/100*100+que[front]%10;   //变十位
    		for(int i=0;i<=9;i++)
    		{
    			if(num[t]&&!f[t]&&m[front]!=2)
    			{
    				que[rear]=t;
    				f[t]=true;
    				m[rear]=2;
    				step[rear]=step[front]+1;
    				if(que[rear]==n2)
    					return step[rear];
    				rear++;
    			}
    			t+=10;
    		}
    		t=que[front]/1000*1000+que[front]%100; //变百位
    		for(int i=0;i<=9;i++)
    		{
    			if(num[t]&&!f[t]&&m[front]!=3)
    			{
    				que[rear]=t;
    				f[t]=true;
    				m[rear]=3;
    				step[rear]=step[front]+1;
    				if(que[rear]==n2)
    					return step[ rear];
    				rear++;
    			}
    			t+=100;
    		}
    		t=1000+que[front]%1000;
    		for(int i=0;i<=8;i++)     //变千位
    		{
    			if(num[t]&&!f[t]&&m[front]!=4)
    			{
    				que[rear]=t;
    				f[t]=true;
    				m[rear]=4;
    				step[rear]=step[front]+1;
    				if(que[rear]==n2)
    					return step[rear];
    				rear++;
    			}
    			t+=1000;
    		}
    		front++;
    	}
    }
    
    int main()
    {
    	judgeprime();
    	int T;
    	cin>>T;
    	/*for(int i=1000;i<10000;i++)
    		if(num[i])
    			cout<<i<<' ';*/
    	while(T--)
    	{
    		cin>>n1>>n2;
    		memset(que,0,sizeof(que));
    		memset(f,false,sizeof(f));
    		memset(step,0,sizeof(step));
    		memset(m,0,sizeof(m));
    		cout<<BFS()<<endl;
    	}
    }
    
  • 相关阅读:
    《剑指offer》面试题7:旋转数组的最小数字
    eclipse ------ TODO、FIXME、XXX 等任务标记
    RT-Thread ------ waitqueue
    RT-Thread ------ 设备注册
    ubuntu 安装 glibc
    openwrt上面移植MQTT代码
    MH5000-31模组无法识别SIM卡
    "Hello osmdroid World"手机GPS轨迹数据
    地质数据下载
    绘图软件Surfer绘制等高线
  • 原文地址:https://www.cnblogs.com/aljxy/p/3337505.html
Copyright © 2020-2023  润新知