洛谷P1218-[USACO1.5]特殊的质数肋骨 Superprime Rib (DFS)

思路:将数位一位一位加,一旦发现不是质数就跳过,否则继续递归下一位

例子:

5->51(跳过);

5->53(可以);

5->57(跳过);

5->59(可以)。

就是↓

    int x = m * 10 + 1;
    if (pd(x)) dfs (t + 1, x);
    x = m * 10 + 3;
    if (pd(x)) dfs (t + 1, x);
    x = m * 10 + 7;
    if (pd(x)) dfs (t + 1, x);
    x = m * 10 + 9;
    if (pd(x)) dfs (t + 1, x);

得出的规律:在开头只能添加1,2,3,5,7四个数;在中间及末尾只能添加1,3,7,9四个数

    dfs (2, 2);
    dfs (2, 3);
    dfs (2, 5);
    dfs (2, 7);

如果在中间添加5则会变成5的倍数


代码:

#include 

using namespace std;

int n;

bool pd (int t) { //判断质数
    if (t == 2) return true;
    if (t % 2 == 0) return false;
    for (int i = 3; i * i <= t; i++) {
        if

你可能感兴趣的:(洛谷题目,深度优先,算法,c++)