`
200830740306
  • 浏览: 109397 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Poj3126

J# 
阅读更多


import java.io.BufferedInputStream;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author NC
 * poj3126
 * 筛素数+bfs
 * 最初判断素数是打算一个一个按照基本定义去判断,后来想到当case多的时候,有很多重复的操作
 * 所以就找到了线性筛素数的模版,简单改了一下,得到了一张素数表,这样应该会快一点
 * 而作bfs时
 * 发现,每一步有39个方向.....如果要调试的话,应该很麻烦
 * 果然当写完程序时,测试的样例都过不了,郁闷啊......
 * 最后发现一个循环少了个=号...无语
 */
public class Poj3126 {

    static boolean[] isPrime = Prime.getPrimes(10000);

    public static void main(String[] args) {

        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        int cas = scan.nextInt();
        for (int i = 1; i <= cas; i++) {
            int start = scan.nextInt();
            int end = scan.nextInt();
            boolean[] isVisited = new boolean[10000];
            int[] step = new int[10000];
            LinkedList<Integer> queue = new LinkedList();
            queue.addLast(start);
            isVisited[start] = true;
            while (!queue.isEmpty()) {
                int current = queue.pop();
                if (current == end) {
                    break;
                }
                for (int j = 0; j <= 9; j++) {//少了等号
                    int next1 = getNext(1, j, current);
                    int next2 = getNext(2, j, current);
                    int next3 = getNext(3, j, current);
                    int next4 = getNext(4, j, current);
                    if (!isVisited[next1]) {
                        queue.addLast(next1);
                        step[next1] = step[current] + 1;
                        isVisited[next1] = true;
                    }
                    if (!isVisited[next2]) {
                        queue.addLast(next2);
                        step[next2] = step[current] + 1;
                        isVisited[next2] = true;
                    }
                    if (!isVisited[next3]) {
                        queue.addLast(next3);
                        step[next3] = step[current] + 1;
                        isVisited[next3] = true;
                    }
                    if (!isVisited[next4]) {
                        queue.addLast(next4);
                        step[next4] = step[current] + 1;
                        isVisited[next4] = true;
                    }
                }
            }
            System.out.println(step[end]);
        }
    }

    public static int getNext(int flag, int i, int current) {
        int next = 0;
        if (flag == 1) {
            if (i == 0) {
                return current;
            }
            next = current % 1000 + i * 1000;
        }
        if (flag == 2) {
            int t = current / 1000;
            next = t * 1000 + current % 1000 % 100 + i * 100;
        }
        if (flag == 3) {
            int t = current / 100;
            int tt = current % 10;
            next = t * 100 + i * 10 + tt;
        }
        if (flag == 4) {
            next = current / 10 * 10 + i;

        }
        if (!isPrime[next]) {
            return current;
        }
        return next;
    }
}
/*
线性筛素数的一个方法,返回一个素数表
 */

class Prime {

    public static boolean[] getPrimes(int n) {
        int i, j, k, x;
        boolean[] a = new boolean[n];
        n++;
        n /= 2;
        int[] b = new int[(n + 1) * 2];
        a[2] = true;
        a[3] = true;
        for (i = 1; i <= 2 * n; i++) {
            b[i] = 0;
        }
        for (i = 3; i <= n; i += 3) {
            for (j = 0; j < 2; j++) {
                x = 2 * (i + j) - 1;
                while (b[x] == 0) {
                    a[x] = true;
                    for (k = x; k <= 2 * n; k += x) {
                        b[k] = 1;
                    }
                }
            }
        }
        return a;
    }
}
分享到:
评论

相关推荐

    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:...

    ACM-POJ 算法训练指南

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

    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]...

    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