`

poj 3126

 
阅读更多

题意:  给定两个素数(四位数),求第一个数经过几次转换能够得到第二个素数。转换方式:是变换数中某一位的数字(第一位不能为零,其他的变换数字是0~~9),变换之后的数也为素数。

思路:bfs,搜索求最短路径,很容易就想到广度优先搜索;因为广度优先搜索,第一次搜到得到的步数就是最少的步数。为了提高判断的时候的速率;打了一个素数表。

不说了直接看代码:

#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
const int Max = 10005;
bool prime[Max], visit[Max];



void funprime()
{
    for(int num = 1000; num < 10000; num ++)
	{
        prime[num] = true;
        for(int i = 2; i <= sqrt(float(num)); i ++)
            if(num % i == 0)
			{
                prime[num] = false;
                break;
            }
	}
}       //  先打出一张素数表。



int izero(int num, int n)
{
    int m[5], i;     //  运用数组m[5]存放各位数,解决了许多繁琐,自认为很巧妙。
    for(i = 1; i <= 4; i ++)
	{
        m[i] = num % 10;
        num = num / 10;
    }
    m[n] = 0;
    for(i = 1; i <= 4; i ++)
        num += m[i] * pow(10.0, i - 1);
    return num;
}       //  对num的从右算起第n位置0,如num=8792,n=3,则返回8092。



int main()
{
    int n, sta, end;
	
 
    funprime();
    cin >> n;
	
    while(n --)
	{
        cin >> sta >> end;
        if(sta == end)
		{
            cout << '0' << endl;
            continue;
        }
		
		
		
        bool fine = false;
        int steps = 0;
        queue<int> pri;
        pri.push(sta);
        memset(visit, false, sizeof(visit)); 
        visit[sta] = true;
		
		
		
        while(!pri.empty() && !fine)
		{
            int t = pri.size();
            steps ++;
            while(t --)
			{
                int num = pri.front();
                pri.pop();
				int i;
                for( i = 1; i <= 4; i ++)
				{
                    int n = izero(num, i);
                    int j;
                    for( j = 0; j <= 9; j ++)
					{
                        int now = n + j * pow(10.0, i - 1);
                        if(now == end)
						{
                            fine = true;  // 一开始写成fine == true,调了很久。
                            break;
                        }
                        else if(prime[now] && !visit[now])
						{
                            pri.push(now);
                            visit[now] = true;
                        }
                    }
                }
            }
        }
        if(fine) 
			cout << steps << endl;
        else cout << "Impossible" << endl;
    }
    return 0;
}

 

 

 

分享到:
评论

相关推荐

    POJ3126-Prime Path

    【标题】"POJ3126-Prime Path" 是北京大学在线编程平台POJ上的一道题目,主要涉及算法和数论方面的知识。这道题目要求我们寻找一条从图中的某个节点出发,经过一系列相邻节点,且每个节点的值都是素数的路径。 ...

    POJ算法题目分类

    * 广度优先搜索:广度优先搜索是指解决问题的广度优先搜索算法,如 poj3278、poj1426、poj3126、poj3087、poj3414。 * 简单搜索技巧和剪枝:简单搜索技巧和剪枝是指解决问题的简单搜索技巧和剪枝算法,如 poj2531、...

    poj题目分类

    * 广度优先搜索:例如 poj3278、poj1426、poj3126、poj3087、poj3414。 * 简单搜索技巧和剪枝:例如 poj2531、poj1416、poj2676、poj1129。 5. 动态规划: * 背包问题:例如 poj1837、poj1276。 * 类型 DP:...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj3278, poj1426, poj3126, poj3087, poj3414 - **解释**:复杂动态规划问题可能涉及多维状态转移、记忆化搜索等技巧。 #### 3. 状态压缩动态规划 - **例题**:poj2531, poj1416, poj2676, poj1129 - ...

    经典 的POJ 分类

    - POJ 3126、POJ 3087:复杂搜索策略解决实际问题。 ### 动态规划 #### 一维动态规划 - **题目示例**: - POJ 1837、POJ 1276:基础动态规划问题。 #### 多维动态规划 - **题目示例**: - POJ 3267、POJ 1836...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj3278](https://vjudge.net/problem/POJ-3278)、[poj1426](https://vjudge.net/problem/POJ-1426)、[poj3126](https://vjudge.net/problem/POJ-3126)、[poj3087]...

    ACM-POJ 算法训练指南

    2. **组合数学**:如排列组合计算(poj3278, poj1426, poj3126, poj3087.poj3414)。 3. **矩阵运算**:矩阵乘法和矩阵快速幂(poj2531, poj1416, poj2676, 1129)。 ### 五、状态压缩 1. **状态压缩动态规划**:...

    POJ 分类题目

    - poj3126 - poj2251 - poj2243 - poj3352 - poj1111 - poj3051 - poj1129 - poj2907 - **应用场景**:适用于搜索、连通性检测等问题。 **2. 最短路径算法** - **定义**:包括 Dijkstra 算法、Bellman-Ford...

    POJ题目分类

    - **示例题目**: poj3278, poj1426, poj3126, poj3087, poj3414 #### 4. 字符串搜索 - **内容**: 包括后缀树、AC自动机等字符串搜索算法。 - **示例题目**: poj2531, poj1416, poj2676, poj1129 ### 五、数学 ##...

    ACM常用算法及其相应的练习题.docx

    * 广度优先搜索:poj3278, poj1426, poj3126, poj3087, poj3414 * 简单搜索技巧和剪枝:poj2531, poj1416, poj2676, poj1129 五、动态规划 * 背包问题:poj1837, poj1276 * 类似表的简单 DP:poj3267, poj1836, ...

    ACM常用算法及其相应的练习题 (2).docx

    (2) 广度优先搜索:poj3278, poj1426, poj3126, poj3087, poj3414 (3) 简单搜索技巧和剪枝:poj2531, poj1416, poj2676, 1129 五、动态规划 本部分涵盖了动态规划,包括背包问题、简单DP和其他DP问题。 (1) 背包...

    北大acm试题

    poj2488、poj3083和poj3009是DFS的例子,而poj3278、poj1426和poj3126则侧重于BFS。poj2531、poj1416和poj2676等题目则包含搜索技巧和剪枝的实践。 五、动态规划 动态规划是一种高效解决问题的方法,常用于背包问题...

    ACM 题型

    - 示例题目:poj3278, poj1426, poj3126, poj3087, poj3414 3. **矩阵优化** - 示例题目:poj2531, poj1416, poj2676, poj1129 #### 数学 1. **组合数学** - **组合数计算** - **容斥原理** - **递推关系** ...

    ACM常用算法及其相应的练习题 (2).pdf

    例题:poj3278、poj1426、poj3126、poj3087、poj3414。 * 简单搜索技巧和剪枝:简单搜索技巧和剪枝是指用于优化搜索算法的技术。例题:poj2531、poj1416、poj2676、poj1129。 五、动态规划 * 背包问题:背包问题是...

    ACM 新手指南 PKU 题目分类

    - 示例题目:POJ 3278, POJ 1426, POJ 3126, POJ 3087, POJ 3414 - **树形DP**:针对树形结构的问题,利用子问题的解来求解原问题。 - 示例题目:POJ 2531, POJ 1416, POJ 2676, 1129 ##### 4. 几何问题 - **...

    北大、杭电ACM试题分类

    - POJ 3278, POJ 1426, POJ 3126, POJ 3087, POJ 3414 区间动态规划是解决具有区间依赖关系问题的有效方法,如股票买卖问题。 3. **矩阵链乘法** - POJ 2531, POJ 1416, POJ 2676, POJ 1129 矩阵链乘法问题...

    ACM题目分类.txt

    - POJ 3126 - POJ 3087 - POJ 3414 ### 概率统计 #### 1. 概率计算 - **描述**:概率计算涉及概率理论的基本概念和方法。 - **应用场景**:赌博游戏、风险评估等。 - **相关题目**: - POJ 3252 - POJ 1850 ...

    算法训练方案详解

    - **示例题目**: POJ 3278, POJ 1426, POJ 3126, POJ 3087, POJ 3414 - **注意事项**: 使用队列来存储待访问节点。 **3. 搜索技巧与剪枝** - **定义**: 通过剪枝减少不必要的搜索空间。 - **应用场景**: 搜索...

    ACM算法总结--最新总结的ACM算法

    2. **AC自动机**(如poj3278, poj1426, poj3126, poj3087, poj3414):多模式字符串匹配算法,用于同时匹配多个模式字符串,适用于病毒扫描、关键词过滤等场景。 3. **状态压缩DP**(如poj2531, poj1416, poj2676, ...

    LeetCode判断字符串是否循环-Leetcode:刷!

    3126 POJ 3414 POJ 2251 简单搜索技巧和剪枝 POJ 1010 :star: POJ 2362 POJ 1011(搜索+剪枝) POJ 1416 POJ 2676 POJ 1129:white_question_mark: 数据结构 串 POJ 1016 POJ 1035 POJ 3080 POJ 1936 排序(快排) ...

Global site tag (gtag.js) - Google Analytics