zoukankan      html  css  js  c++  java
  • 一个3*3的格子,给定n>=10, 将[1,n]中的数填入方格中,使得相邻方格的数的和为质数

    深搜 回溯

    bool isprimer(int tt)        //判断该数是否为质数
    {
        if (tt == 2||tt == 3)
        {
            return true;
        }
        else if (tt == 1||tt%2 == 0)
            return false;
        for (int i = 2;i <= sqrt(static_cast<double>(tt));++i)
        {
            if (tt%i == 0)
                return false;
        }
        return true;
    }
    bool test(int a[],int dp,int val)          //在位置dp上加入val 是否符合相邻为质数的条件
    {
        switch (dp)
        {
        case 0:
            return true;
        case 1:
        case 3:
            return isprimer(val + a[0])?1:0;
        case 2:
            return isprimer(val + a[1])?1:0;
        case 4:
            return (isprimer(val + a[1])&&isprimer(val + a[3]))?1:0;
        case 5:
            return (isprimer(val + a[2])&&isprimer(val + a[4]))?1:0;
        case 6:
            return isprimer(val + a[3])?1:0;
        case 7:
            return (isprimer(val + a[6])&&isprimer(val + a[4]))?1:0;
        case 8:
            return (isprimer(val + a[5])&&isprimer(val + a[7]))?1:0;
        }
        return true;
    }
    
    const int n = 9;
    
    void dfs(int a[],int num[],int len,bool ch[],int dp) //深搜 回溯  num中包含符合条件的len个数  ch为判断该数是否已选(防止重复选)
    {
        if (dp == n)
        {
            for (int i = 0;i < 3;++i)
            {
                for (int j = 0;j < 3;++j)
                {
                    cout<<a[i*3 + j]<<' ';
                }
                cout<<endl;
            }
            system("pause");
            return;
        }
        for (int i = 0 ; i < len;++i)
        {
            if (!ch[i]&&test(a,dp,num[i]))     
            {
                ch[i] = true;
                a[dp] = num[i];
                dfs(a,num,len,ch,dp + 1);
                ch[i] = false;
            }
        }
    }
    int main()
    {
    
        int a[n];
        const int len = 15;
        int num[len];
        bool ch[len];
        memset(ch,0,sizeof(ch));
        for (int i = 0;i < len;++i)
        {
            num[i] = i + 1;
        }
        dfs(a,num,len,ch,0);
        return 0;
    }
  • 相关阅读:
    hbase 相关
    java 连接 hiveserver2 例子
    ik_max_word ik_smart 区别 和 单字 查询 不到问题
    如何计算地址线和数据线
    golang consistent hash 菜鸟分析
    借助GitHub托管你的项目代码
    PHP性能追踪及分析工具xhprof的安装与使用
    git使用方法
    go开发
    go的websocket实现
  • 原文地址:https://www.cnblogs.com/itachi7/p/2669386.html
Copyright © 2011-2022 走看看