`
t0uch
  • 浏览: 58315 次
  • 性别: Icon_minigender_1
  • 来自: 柳州
社区版块
存档分类
最新评论

四阶幻方

阅读更多
我写的四阶幻方出来了,运行结果正确,7040个的版本。虽然好像还有些问题,不过算了,能跑就可以了,呵呵。
不要输出的话我的p4 3.2G上耗时5s,算还过得去吧 ^_^
以下是程序:
cpp 代码
 
  1. #include <iostream></iostream>
  2. #include <time.h></time.h>

  3. using namespace std;  
  4.   
  5. struct uni  
  6. {  
  7.     int a,b,c,d;  
  8. };  
  9.   
  10. uni can[2065];  
  11. long sum = 0;  
  12. int sum_all = 0;  
  13.   
  14. void get_all_num()  
  15. {  
  16.     for(int i = 1;i <= 16;++i)  
  17.     {  
  18.         for(int j = 1;j <= 16;++j)  
  19.         {  
  20.             for(int k = 1; k <= 16; ++k)  
  21.             {  
  22.                 for(int l = 1;l <= 16;++l)  
  23.                 {                 
  24.                     if(i != j && i != k && i != l && j != k && j != l && k != l)  
  25.                         if(i + j + k + l == 34)  
  26.                         {  
  27.                             can[sum].a = i;  
  28.                             can[sum].b = j;  
  29.                             can[sum].c = k;  
  30.                             can[sum].d = l;  
  31.                             ++sum;  
  32.                         }  
  33.                 }  
  34.             }  
  35.         }  
  36.     }  
  37. }  
  38.   
  39. void p_rint(const int sq[])  
  40. {  
  41.     cout << "i wIll gIvE yOu sOme coLoR 2CC! " << sum_all <
  42.     cout << sq[0] << " " << sq[1] << " " << sq[2] << " " << sq[3] << endl;  
  43.     cout << sq[4] << " " << sq[5] << " " << sq[6] << " " << sq[7] << endl;  
  44.     cout << sq[8] << " " << sq[9] << " " << sq[10] << " " << sq[11] << endl;  
  45.     cout << sq[12] << " " << sq[13] << " " << sq[14] << " " << sq[15] << endl << endl;  
  46. }  
  47.   
  48. inline bool caca(const int sq[])  
  49. {  
  50.     if(sq[0] + sq[4] + sq[8] + sq[12] !=34)  
  51.         return false;  
  52.     if(sq[2] + sq[6] + sq[10] + sq[14] !=34)  
  53.         return false;  
  54.     return true;  
  55. }  
  56.   
  57. inline bool detec_2(const int sq[])  
  58. {  
  59.     int km2[17];  
  60.     int i,m;  
  61.     for(i = 0;i < 16;++i)  
  62.     {  
  63.         km2[i] = 0;  
  64.     }  
  65.   
  66.     for(m = 0;m < 16;++m)  
  67.     {  
  68.         km2[sq[m]]++;  
  69.         if(km2[sq[m]] > 1)  
  70.             return false;  
  71.     }  
  72.   
  73.     return true;  
  74. }  
  75. inline bool detec_1(const int c1[],const int c2[])  
  76. {  
  77.     int km2[17];  
  78.     for(int i = 0;i < 16;++i)  
  79.     {  
  80.         km2[i] = 0;  
  81.     }  
  82.   
  83.     km2[c1[0] - 1]++;  
  84.     km2[c1[1] - 1]++;  
  85.     km2[c1[2] - 1]++;  
  86.     km2[c1[3] - 1]++;  
  87.       
  88.     km2[c2[0] - 1]++;  
  89.     km2[c2[1] - 1]++;  
  90.     km2[c2[2] - 1]++;  
  91.     km2[c2[3] - 1]++;  
  92.   
  93.     for(i = 0;i < 16;i++)  
  94.     {  
  95.         if(km2[i] > 1)  
  96.             return false;  
  97.     }  
  98.   
  99.     return true;  
  100. }  
  101.   
  102. void fill_in_line(int c1[],int c2[])  
  103. {  
  104.     int sq[16];  
  105.   
  106.     sq[0] = c1[0];  
  107.     sq[5] = c1[1];  
  108.     sq[10] = c1[2];  
  109.     sq[15] = c1[3];  
  110.   
  111.     sq[3] = c2[0];  
  112.     sq[6] = c2[1];  
  113.     sq[9] = c2[2];  
  114.     sq[12] = c2[3];           
  115.   
  116.     for(int k = 1;k <= 16;k++)  
  117.     {  
  118.         sq[4] = k;  
  119.           
  120.         for(int l = 1;l <= 16;++l)  
  121.         {  
  122.             sq[1] = l;  
  123.                   
  124.             sq[7] = 34 - sq[4] - sq[5] - sq[6];  
  125.             sq[11] = 34 - sq[3] - sq[7] - sq[15];  
  126.             sq[8] = 34 - sq[9] - sq[10] - sq[11];  
  127.             sq[13] = 34 - sq[1] - sq[5] - sq[9];  
  128.             sq[14] = 34 - sq[12] - sq[13] - sq[15];  
  129.             sq[2] = 34 - sq[0] - sq[1] - sq[3];  
  130.           
  131.             if(sq[7] > 0 && sq[11] > 0 && sq[8] > 0 && sq[13] > 0 && sq[14] > 0 && sq[2] > 0)  
  132.                 if(sq[7] <= 16 && sq[11] <= 16 && sq[8] <= 16 && sq[13] <= 16 && sq[14] <= 16 && sq[2] <= 16)  
  133.                     if(detec_2(sq) && caca(sq))  
  134.                     {  
  135.                         sum_all++;  
  136.                         p_rint(sq);  
  137.                     }  
  138.         }  
  139.     }  
  140.   
  141. }  
  142. void fill_in_eight()  
  143. {  
  144.     int cse1[4],cse2[4];  
  145.   
  146.     for(int i = 0;i < sum;++i)  
  147.     {  
  148.         for(int j = 0;j < sum;++j)  
  149.         {  
  150.             if( i!=j )  
  151.             {  
  152.                 cse1[0] = can[i].a;  
  153.                 cse1[1] = can[i].b;  
  154.                 cse1[2] = can[i].c;  
  155.                 cse1[3] = can[i].d;  
  156.   
  157.                 cse2[0] = can[j].a;  
  158.                 cse2[1] = can[j].b;  
  159.                 cse2[2] = can[j].c;  
  160.                 cse2[3] = can[j].d;  
  161.                   
  162.                 if(detec_1(cse1,cse2))  
  163.                 {  
  164.                     fill_in_line(cse1,cse2);  
  165.                 }  
  166.             }  
  167.               
  168.         }  
  169.     }  
  170. }  
  171.   
  172. int main()  
  173. {  
  174.     time_t t;  
  175.     t = clock();  
  176.   
  177.     get_all_num();  
  178.     fill_in_eight();  
  179.   
  180.     cout << "time consumed: " << clock() - t << " ms"<< endl;  
  181.     cin.get();  
  182.     return 0;  
  183. }  

写得比较烂,咳咳咳


找个时间,来个ruby版的。
ps:最近发现牛人们都很臭屁,臭不可闻啊,唉,风气啊风气。做技术的人都很臭屁,果然啊果然,但愿我以后不会这样。
分享到:
评论

相关推荐

    四阶幻方练习题.pdf

    四阶幻方的难点:四阶幻方的填充难点在于需要同时满足多个条件,例如,每行、每列、每个对角线上的数字之和都需要相等,同时还需要满足其他一些约束条件,例如,同一行、同一列、同一对角线上的数字不能重复等。...

    n阶幻方生成算法C++源代码

    目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方,这三种幻方的构造方法均已经被找到。 本人根据网上找到的构造算法,花了一天的休息时间将n阶幻方的生成算法利用C++实现,希望能...

    C#,任意阶幻方(Magic Square)的算法与源代码

    而在国外,十二世纪的阿拉伯文献也有六阶幻方的记载,中国的考古学家们曾经在西安发现了阿拉伯文献上的五块六阶幻方,除了这些以外,历史上最早的四阶幻方是在印度发现的,那是一个完全幻方(后面会提到),而且比...

    四阶幻方的变换群 (2008年)

    ### 四阶幻方的变换群 #### 一、引言 四阶幻方作为一种经典的数学构造,在数学史中有着悠久的历史。早在公元前500年的中国春秋时期的《大戴礼》中就有提及,而在西方则由希腊人Alexandria Theon在公元130年首次...

    java 奇数阶幻方

    奇数阶幻方,也称为拉丁方,是一种古老而有趣的数学问题,其历史可以追溯到中国的《洛书》。在奇数阶幻方中,我们通常要在一个n×n的矩阵(n为奇数)中填入1到n²的整数,每个数字恰好出现一次,并且每行、每列以及...

    C++实现奇数阶幻方

    奇数阶幻方的C++实现,欢迎交流

    奇数阶幻方算法

    对于奇数阶幻方,还可以参考九宫格(3阶幻方)的口诀:“九子斜排,上下对易,左右相更,四维突出。”这一口诀可以帮助我们理解填充的规律,特别是当阶数为奇数时,可以通过菱形结构和对角线的交替变换来构建幻方。 ...

    C语言3阶幻方源码

    **3阶幻方** 3阶幻方是一种古老的数学游戏,起源于中国,称为“洛书”,是八卦的基础之一。在3阶幻方中,我们使用一个3x3的矩阵,目标是将数字1到9填充到这个矩阵中,使得每一行、每一列以及两条对角线上的数字之和...

    选讲2 三阶幻方的性质.doc

    6. **性质6**:幻方四角的数字等于与它们不相邻的两个行列中间数的平均值。这一特性确保了四角的数字满足幻和的条件。 7. **性质7**:在包含相同数字的行或列中,其他两个数字的和相等。这是幻方构造中的一个重要...

    2.4幻方的构造1

    通常,5阶幻方的中心位置应该是16,因为5阶幻方的最外层四个角上的数字分别是1到4,然后按照一定的规则填充其余数字。 2. **5阶幻方的行和**: 5阶幻方的行和等于阶数的平方乘以阶数的一半,即\( 5^2 \times \frac...

    求偶数阶幻方

    ### 偶数阶幻方实现与解析 #### 一、引言 幻方是一种古老而迷人的数学构造,它由n×n个格子组成,每个格子内填有从1到n²的不同整数,使得每行、每列以及两条对角线上的数字之和相等。当幻方的阶数为偶数时,则...

    生成n阶幻方的程序

    一个n阶幻方是一个n×n的方阵,每个单元格内填入从1到n²的整数,使得每行、每列以及两条对角线上的数字之和都相等。生成n阶幻方的程序是利用算法来自动构建满足条件的幻方。 幻方的构造方法有很多种,其中最常见的...

    幻方的构造方法.ppt

    八阶幻方,由于是双偶数阶,我们可以将其视为4个四阶幻方的组合,再利用对称交换法分别构造每个四阶幻方,最后组合成完整的八阶幻方。 总之,幻方的构造是一门深奥的数学艺术,它涉及到排列组合、对称性、旋转等...

    幻方研究(计算机实现)

    2. **偶数阶幻方的构造**:利用四阶幻方的构造方法,可以推广到偶数阶幻方。当n为偶数时,自然方阵的行和列形成等差关系,通过行与行、列与列的对称交换,可以构建幻方。这一过程可以通过计算机程序自动化实现。 3....

    幻方之填法(自我学习总结).pdf

    - 四阶幻方的对角线不动,对角线外的数字对称交换,适用于所有双偶数阶幻方。 - 单偶数阶幻方需要将幻方分为四个部分,填充后再进行特定行或列的交换。 了解这些基本的幻方填法规则后,可以通过练习不同阶数的幻...

    java算法代码(n阶幻方)

    【Java实现n阶幻方】 在信息技术领域,算法是解决问题的关键。Java作为一种广泛使用的编程语言,不仅在企业级应用中占据重要地位,同样在算法实现上具有强大的支持。本篇文章将详细探讨如何使用Java实现一个n阶幻方...

    高阶幻方产生 优质算法

    高阶幻方是一种数学结构,它在二维矩阵中排列一系列整数,使得每行、每列、以及两条对角线上的数字之和都相等。这些整数通常是从1开始的自然数序列,但也可以是其他任何整数序列。高阶幻方的“阶”指的是矩阵的大小...

    n阶幻方java代码

    n阶幻方的求法(java代码版)。由于现在网上还没有系统的求n阶幻方的java代码,所以写出来供大家参考!

    幻方构造方法

    奇数阶幻方的Lombere构造法(斜排法)是一种更为系统化的方法,以五阶幻方为例,其步骤具有可复制性,适用于所有奇数阶幻方。 单偶数(即2(2m+1)阶)阶幻方的Ralph Strachey构造法是一种适用于2(2m+1)阶幻方的方法...

    100以内奇数幻方的生成

    根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M + 2阶幻方,其中M为自然数,2阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法...

Global site tag (gtag.js) - Google Analytics