zoukankan      html  css  js  c++  java
  • noj算法 素数环 回溯法

    描述:

    把1到20这重新排列,使得排列后的序列A满足:
    a. 任意相邻两个数之和是素数
    b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)

    输入:

    没有输入。

    输出:

    输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。

     

    题解:

           只打印字典序最小的一项即可。逐个数判断能否与我们放好的前一个数相加为素数,若不是素数,则回溯;若是,继续搜索。找到满足条件的第一个解即可。

     

    代码:

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <math.h>
    
    using namespace std;
    int num[22];
    bool used[22];
    int couse=1;
    
    bool check(int x,int y)
    {
        int k=2,i=x+y;
        while(k<=sqrt(i)&&i%k!=0) k++;
        if(k>sqrt(i)) return true;
        return false;
    }
    
    void print()
    {
        printf("%d",num[1]);
        for(int i=2;i<=20;i++)
            printf(" %d",num[i]);
        printf("
    ");
    }
    
    void Search(int x)
    {
        for(int i=1;i<=20;i++)
        {
            if(!used[i]&&check(num[x-1],i)&&couse==1)
            {
                num[x]=i;
                used[i]=true;
                if(x==20&&check(num[1],num[20])&&couse==1)
                    {print();couse++;return ;}
                Search(x+1);
                used[i]=false;
            }
        }
    }
    
    
    int main()
    {
        Search(1);
        return 0;
    }

     

     

     

  • 相关阅读:
    LinkedList类源码浅析(一)
    ArrayList类源码浅析(三)
    我谁也没等,因为谁也不会来
    维持一段友谊
    最甜美的悲伤
    小美人访谈录笔记[1]
    1984我想对这个世界说些什么
    我喜欢我
    等不来的始终等不来,无须报以希望
    我抱有怀疑
  • 原文地址:https://www.cnblogs.com/y1040511302/p/9733392.html
Copyright © 2011-2022 走看看