回溯算法之素数环

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SeqListSort
{
    /// <summary>
    /// <ather>
    /// lihonglin
    /// </ather>
    /// <content>
    /// 把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
    ///分析:用回溯算法,考察所有可能的排列
    /// </content>
    /// </summary>
    class PrimeFor
    {
        static int n = 14;
        static int[] a = new int[20];//a数组存放素数环

        public static void InitPrimeFor()
        {
            for (int i = 0; i < 20; ++i )
            {
                a[i] = i + 1;
            }
        }

        public static void Swap( int i,  int j)
        {
            a[i] = a[i] + a[j] - (a[j] = a[i]);
        }

        static void PrintResult()
        {
            for (int i = 0; i < n; ++i)
            {
                Console.Write("{0,-4}" , a[i]);
            }
            Console.WriteLine();
        }

        static bool IsOK(int num)
        {
            for ( int i = 2; i <= (int)Math.Sqrt(num); ++i )
            {
                if (0 == num % i)
                {
                    return false;
                }
            }
            return true;
        }

        public static void Search(int k)
        {
            int i = 0;
            if ( k > n - 1 )//判断结束条件
            {
                if ( IsOK(a[0] + a[n - 1]) )
                    PrintResult();
                return;
            }
            else
            {
                for (i = k; i < n; ++i )
                {
                    Swap(k, i);
                    if(IsOK(a[k - 1] + a[k]))
                    {
                        Search(k + 1);//继续探索
                    }
                    //回溯
                    Swap(k, i);
                }

            }
        }
    }
}
时间: 2024-10-23 16:31:17

回溯算法之素数环的相关文章

回溯算法求素数环

原文地址:http://www.cnblogs.com/xwz0528/p/4638242.html 一. 问题描述 把从1到n(n>=2)这n个数摆成一个环,要求相邻的两个数的和是一个素数,找出所有满足条件的环. 二. 问题分析 1> 解向量:<x1, x2, ··· , xn> 2> 解空间树:排列树,(n-1)!个叶子结点 3> 剪枝函数:isPrime( x[t-1]+x[t] ),t=2,3,···,n  约束函数 三. 算法实现 1 #include<

算法练习--素数环

输入一个数字n,输出[1,N]内的全部组合,满足a[i]+a[i+1]为素数.当中i∈[0,i-1] 比如输入:6 输出:1,4,3,2,5,6 实现: var MAX = 10; ////setup prime array var primeArr = new Array(); var Ann = function a(arr){ if(arr.length <= 1){return arr;} var rr = new Array(); for(var i = 0; i<arr.lengt

ACM:回溯法,八皇后问题,素数环

(一)八皇后问题 (1)回溯法 #include <iostream> #include <string> #define MAXN 100 using namespace std; int tot = 0, n = 8; int C[MAXN]; void search(int cur) { if(cur == n) ++tot; //递归边界,只要走到了这里,所有皇后必然不冲突 else for(int i = 0; i < n; ++i) { int ok = 1; C

搜索与回溯 - 素数环

[题目描述] 从1到20,这20个数摆成一个环,要求相邻的两个数的和是一个素数.求所有可能. [算法分析&&参考代码] 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int a[21],ans=0; //a数组表示第几个位置的数是啥. 5 bool b[21]={0}; //b数组表示标记,这个数用过没有? 6 bool pd(int,int); 7 void dfs(int);

素数环

问题描述: 将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18 php版本回溯算法: 1 <?php 2 //素数环问题 3 include "show.php"; 4 5 define("LEN", 20); 6 7 class Primes 8 { 9 privat

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

数据结构之回溯算法

借鉴:http://blog.csdn.net/baple/article/details/7181404 package database; public class NQuee { public static boolean Verify(int arr[],int i){                              //仅仅判断能不能放置这个皇后        for(int k =1;k != i;k++)