• poj_3126Prime Path


    Prime Path
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 8725   Accepted: 4960

    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

    筛选法求出素数表,然后BFS,不加visited数组,poj超时,hdoj溢出,毕竟重复的节点还是蛮多的。

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    #define MAX 9999
    
    typedef struct Node
    {
    	int x;
    	int cnt;
    }Node;
    int primer[MAX];
    bool visited[MAX];
    queue<Node>Q;
    int y;
    
    void pri() //1代表素数
    {
    	for(int i = 1; i < MAX; i++)
    	{
    		primer[i] = 1;
    	}
    	primer[0] = 0;
    	primer[1] = 0;
    	for(int i = 2; i < MAX / 2; i++)
    	{
    		for(int j = 2; i * j < MAX; j++)
    		{
    			primer[i*j] = 0;
    		}
    	}
    }
    
    int bfs(int x)
    {
    	int a, b, c;
    	while (!Q.empty())
    	{
    		Q.pop();
    	}
    	Node pre, next;
    	pre.x = x;
    	pre.cnt = 0;
    	visited[pre.x] = true;
    	Q.push(pre);
    	while (!Q.empty())
    	{
    		pre = Q.front();
    		Q.pop();
    		if(pre.x == y)
    		{
    			//cout << "YES" << endl;
    			return pre.cnt;
    		}
    
    		c = pre.x / 10; //个位
    		for(int i = 0; i <= 9; i++)
    		{
    			if(primer[c * 10 + i] == 1 && c * 10 + i != pre.x && !visited[c * 10 + i])
    			{
    				visited[c * 10 + i] = true;
    				next.x = c * 10 + i;
    				next.cnt = pre.cnt + 1;
    				Q.push(next);
    			}
    		}
    
    		a = pre.x % 10; //十位
    		b = pre.x / 100;
    		for(int i = 0; i <= 9; i++)
    		{
    			if(primer[(b * 10 + i) * 10 + a] == 1 && (b * 10 + i) * 10 + a != pre.x && !visited[(b * 10 + i) * 10 + a])
    			{
    				visited[(b * 10 + i) * 10 + a] = true;
    				next.x = (b * 10 + i) * 10 + a;
    				next.cnt = pre.cnt + 1;
    				Q.push(next);
    			}
    		}
    
    		a = pre.x % 100;  //百位
    		b = pre.x / 1000;
    		for(int i = 0; i <= 9; i++)
    		{
    			if(primer[100*(b * 10 + i) + a] == 1 && 100 * (b * 10 + i) + a != pre.x && !visited[100 * (b * 10 + i) + a])
    			{
    				visited[100 * (b * 10 + i) + a] = true;
    				next.x = 100 * (b * 10 + i) + a;
    				next.cnt = pre.cnt + 1;
    				Q.push(next);
    			}
    		}
    
    		a = pre.x % 1000; //千位
    		for(int i = 1; i <= 9; i++)
    		{
    			if(primer[i * 1000 + a] == 1 && i * 1000 + a != pre.x && !visited[i * 1000 + a])
    			{
    				visited[i * 1000 + a] = true;
    				next.x = i * 1000 + a;
    				next.cnt = pre.cnt + 1;
    				Q.push(next);
    			}
    		}
    	}
    	return 0;
    }
    
    int main()
    {
    	pri();
    	int x, t;
    	cin >> t;
    	while (t--)
    	{
    		memset(visited, false, sizeof(visited));
    		cin >> x >> y;
    		cout << bfs(x) << endl;
    	}
    }


  • 相关阅读:
    [转]关于WM_NCHITTEST消息
    微信小程序的年月日-年月日选择器基于picker的mode = multiSelector日期范围
    解决移动端浏览器 HTML 音频不能自动播放的三种方法
    小程序反编译
    CSS实现背景透明,文字不透明
    event.target 属性返回哪个 DOM 元素触发了事件。
    微信小程序去除button边框
    jQuery setInterval倒计时精确到毫秒
    获取openid [微信小程序]
    array_column() 函数[二维数组转为一维数组]
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835095.html
Copyright © 2020-2023  润新知