`
eimhee
  • 浏览: 2109898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

四阶素数幻方问题

阅读更多

用1到16构成一个四阶幻方,要求任意相邻两个方格中的数字之各均为素数?

(原帖见:http://topic.csdn.net/u/20070830/18/1f1957c1-5e66-4c3b-8883-d7eef64c8da1.html)

NowCan 网友的解法:

直接递归搜,4阶很快的。以下这个程序就是这样的思路,结果未经过验证。

/*
将1-N^2这N^2个数添如N*N的方格中,每个方格填一个整数,使所有相邻两个方格内的两个整数之和为质数。
例如N=3时如下,无解。N=4时,2992解?N=5时,917848解?算了半个小时
A0 A1 A2
A3 A4 A5
A6 A7 A8
PRIME(A0+A1)
PRIME(A0+A3)
PRIME(A1+A2)
PRIME(A1+A4)
PRIME(A2+A5)
PRIME(A3+A4)
PRIME(A3+A6)
PRIME(A4+A5)
PRIME(A4+A7)
PRIME(A5+A8)
PRIME(A6+A7)
PRIME(A7+A8)
*/
#include  <stdio.h >
#include  <math.h >
#include  <windows.h >

#define MAX_NUM 30
#define _PRINT_ 0

unsigned long   Result[MAX_NUM * MAX_NUM], ResultNum, Used[MAX_NUM * MAX_NUM]={0};
bool            PrimeTable[MAX_NUM * MAX_NUM * 2]={ false };
unsigned long   N, QN;

/* */
void CreatePrimeTable(void)
{
    PrimeTable[0]=false;
    PrimeTable[1]=false;
    PrimeTable[2]=true;
    PrimeTable[3]=true;
    for(unsigned long j=5; j  <= MAX_NUM * MAX_NUM * 2; j+=2)
    {
        PrimeTable[j]=true;
        for(unsigned long i=3; i  <= sqrt((double)j); i+=2)
        {
            if(j % i == 0)
            {
                PrimeTable[j]=false;
                break;
            }
        }
    }
}

/* */
inline bool IsPrime(unsigned long n)
{
    return PrimeTable[n];
}

/* */
bool CheckIt(unsigned long Deep)
{
    if(Deep == 0)
    {
        return true;
    }
    else if(Deep  < N)
    {
        return IsPrime(Result[Deep] + Result[Deep - 1]);
    }
    else if(Deep % N == 0)
    {
        return IsPrime(Result[Deep] + Result[Deep - N]);
    }
    else
    {
        return(IsPrime(Result[Deep] + Result[Deep - 1]) && IsPrime(Result[Deep] + Result[Deep - N]));
    }
}

/* */
void go(unsigned long Deep)
{
    if(Deep == QN)
    {
        ResultNum++;
#if (_PRINT_)
        printf("Find it! No.%lu\n", ResultNum);
        for(unsigned long i=0; i  < QN; i++)
        {
            printf("%lu\t", Result[i]);
            if(i % N == N - 1)
            {
                printf("\n");
            }
        }

#else
        printf("\rFind:%lu", ResultNum);
#endif
    }
    else
    {
        for(unsigned long i=1; i  <= QN; ++i)
        {
            if(!Used[i])
            {
                Result[Deep]=i;
                if(CheckIt(Deep))
                {
                    Used[i]=1;
                    go(Deep + 1);
                    Used[i]=0;
                }
            }
        }
    }
}

/* */
int main(void)
{
    DWORD   tim;
    ResultNum=0;
    printf("Input N:");
    scanf("%lu", &N);
    QN=N * N;
    tim=GetTickCount();
    CreatePrimeTable();
    go(0);
    printf("\n\nN=%lu\n", N);
    printf("Total=%lu\n", ResultNum);
    printf("Time=%lu\n", GetTickCount() - tim);
    return 0;
}

几乎未加任何处理,转成VB代码如下:

Dim prime() As Byte, result() As Long, used() As Byte, n As Long, resultcount As Long
Function checkit(ByVal level As Long) As Byte
If level = 0 Then checkit = 1: Exit Function
If level < n Then checkit = prime(result(level) + result(level - 1)): Exit Function
If level Mod n = 0 Then checkit = prime(result(level) + result(level - n)): Exit Function
checkit = prime(result(level) + result(level - 1)) * prime(result(level) + result(level - n))
End Function

Sub run(Optional ByVal level As Long = 0)
Dim i As Long, j As Long
If level = n * n Then
resultcount = resultcount + 1
Debug.Print "No." & resultcount & vbCrLf & String(4 * n, "-")

For i = 0 To n - 1
For j = 0 To n - 1
Debug.Print Left(result(i * n + j) & "   ", 4);
Next
Debug.Print
Debug.Print
Next
Else
For i = 1 To n * n
If used(i) = 0 Then
result(level) = i
If checkit(level) = 1 Then
used(i) = 1
run level + 1
used(i) = 0
End If
End If
Next
End If
Close #1
End Sub

Sub main()
Dim i As Long, tt As Double
n = 4
ReDim prime(n * n * 2)
ReDim result(n * n)
ReDim used(n * n)
ReDim s(1 To 1000000)
prime(2) = 1
prime(3) = 1
For i = 5 To 2 * n * n Step 2
For j = 3 To Int(Sqr(i))
If i Mod j = 0 Then Exit For
Next
If j = Int(Sqr(i)) + 1 Then prime(i) = 1
Next
tt = Timer
run
MsgBox "共找到" & resultcount & "组解,用时" & Timer - tt & "秒钟!"
End Sub 

返回:

No.1
----------------
1   2   11  12 

4   9   8   5  

7   10  3   14 

6   13  16  15 

No.2
----------------
1   2   11  12 

4   9   8   5  

13  10  3   14 

6   7   16  15 

No.3
----------------
1   2   11  12 

4   15  8   5  

7   16  3   14 

6   13  10  9  

No.4
----------------
1   2   11  12 

4   15  8   5  

13  16  3   14 

6   7   10  9  

No.5
----------------
1   2   11  12 

10  3   8   5  

7   16  15  14 

6   13  4   9  

No.6
----------------
1   2   11  12 

10  3   8   5  

13  16  15  14 

6   7   4   9  

No.7
----------------
1   2   11  12 

10  9   8   5  

7   4   3   14 

6   13  16  15 

No.8
----------------
1   2   11  12 

10  9   8   5  

7   4   15  14 

6   13  16  3  

No.9
----------------
1   2   11  12 

10  9   8   5  

13  4   3   14 

6   7   16  15 

No.10
----------------
1   2   11  12 

10  9   8   5  

13  4   15  14 

6   7   16  3  

No.11
----------------
1   2   11  12 

16  3   8   5  

7   10  9   14 

6   13  4   15 

No.12
----------------
1   2   11  12 

16  3   8   5  

13  10  9   14 

6   7   4   15 

No.13
----------------
1   2   11  12 

16  15  8   5  

7   4   3   14 

6   13  10  9  

No.14
----------------
1   2   11  12 

16  15  8   5  

7   4   9   14 

6   13  10  3  

No.15
----------------
1   2   11  12 

16  15  8   5  

13  4   3   14 

6   7   10  9  

No.16
----------------
1   2   11  12 

16  15  8   5  

13  4   9   14 

6   7   10  3  

.......

共计2992组解法

分享到:
评论

相关推荐

    完美幻方基本理论与编制方法 [胡泰培 编著] 2012年版

    第4章 素数阶完美幻方 第5章 完美幻方之运算 第6章 完美幻方的特优性 第7章 9阶完美幻方 第8章 3因数奇阶完美幻方 第9章 4阶完美幻方和偶阶对顶互补型完美幻方 第10章 双2因数偶阶完美幻方 第11章 单2因数偶...

    论文研究-素数阶均衡完美幻方若干问题初探 .pdf

    中介逻辑是一种区分矛盾否定与对立否定、肯定一些对立知识间存在中介对象的逻辑...在传统与或图搜索算法的基础上,修改启发函数,将模糊知识的推理问题转化为状态空间中的搜索问题,并给出了一种否定信息的处理方法。

    论文研究-基于图像处理的人造板孔穴含量统计的新方法.pdf

    幻方与拉丁方都是属于组合数学范畴的问题,两者关系十分密切。...还从完美拉丁方的缺陷填充问题出发成功规约到均衡完美幻方的缺陷填充问题上,证明了素数阶均衡完美幻方的缺陷填充判定问题是NP完全的。

    c语言实例解析-数值趣味数学篇

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    C语言实例解析精粹

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    220个C语言程序源代码集合.zip

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    220个C语言程序源代码.zip

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    200个C程序.rar

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    220个经典C程序源码文件,可以做为你的学习设计参考.zip

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    200个经典C程序源码(包括基础篇+数据结构篇+数值计算与趣味数学篇+图形篇+系统篇+常见试题解答篇).zip

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    200个经典C程序【源码】

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    易语言经典算法

    求N阶幻方 计算分数的精确值 找零钱 求一元二次方程的根(公式法) 比赛日程(分治法) 两个有序数组的合并 统计投色子(2个)的结果 12小球问题 改进冒泡排序法 螺旋数组 射击环数 猜数字游戏 桶排序 造币厂问题 直接插入...

    C语言经典源代码实例 数据结构 操作系统 图形等

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    C语言源代码实例.rar

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    经典的C程序220案列

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    关于C的精粹包含至少200个C语言小程序

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    C语言220例从易到难源代码

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    C语言学习实例220例

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 奇数平方...

    C语言程序源代码(大集合).rar

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 ...

    200个经典C程序源码小游戏

    084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 ...

Global site tag (gtag.js) - Google Analytics