码迷,mamicode.com
首页 > 编程语言 > 详细

六角幻方 C语言

时间:2016-02-21 19:55:44      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:

方法可能有点笨,采取的是先外圈(1-12),再中间(13-18)的排序方法,这样能尽可能先剪枝剪掉三个求和的,再去掉四个求和的。

但是只用数组,检查重复似乎是一件很困难的事情,得到的十二个结果实际上是一个,2(镜像)*6(角度)技术分享

//原创代码,作者:lhy1024

#include<stdio.h> #include<time.h> #define SUM 38 int count=0; int check(int a[],int flag); int arrange(int a[],int ordinal); void magic_printf(int a[]); int main() { int a[20]= {0}; double start,finish; start=clock();//计时部分 arrange(a,1); finish=clock(); printf( "%f seconds\n",(finish-start)/ CLOCKS_PER_SEC); return 0; } int arrange(int a[],int ordinal) { int i,j; if(ordinal==20) { count++; magic_printf(a);//最后一位进行打印 } else { int b[20]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; for(i=1; i<=ordinal-1; i++) { b[a[i]]=0;//用过的数字将开关调为零 } for(i=1; i<=19; i++) { if(b[i]!=0) { a[ordinal]=i; if(check(a,ordinal)==1)//如果符合条件,递归下一步 arrange(a,ordinal+1); } } } } int check(int a[],int flag) { if(flag==3||flag==5||flag==7||flag==9||flag==11) { if(a[flag-2]+a[flag-1]+a[flag]!=SUM) return 0; } if(flag==14) { if(a[12]+a[13]+a[14]+a[4]!=SUM) return 0; } if(flag==15) { if(a[2]+a[14]+a[15]+a[6]!=SUM) return 0; } if(flag==16) { if(a[4]+a[15]+a[16]+a[8]!=SUM) return 0; } if(flag==17) { if(a[10]+a[17]+a[16]+a[6]!=SUM) return 0; } if(flag==18) { if(a[8]+a[17]+a[18]+a[12]!=SUM) return 0; if(a[2]+a[13]+a[18]+a[10]!=SUM) return 0; } if(flag==19) { if(a[1]+a[13]+a[19]+a[16]+a[7]!=SUM) return 0; if(a[3]+a[14]+a[19]+a[17]+a[9]!=SUM) return 0; if(a[11]+a[18]+a[19]+a[15]+a[5]!=SUM) return 0; } return 1; } void magic_printf(int a[]) { printf("Case: %d\n",count); printf(" %2d %2d %2d\n",a[1],a[2],a[3]); printf(" %2d %2d %2d %2d\n",a[12],a[13],a[14],a[4]); printf("%2d %2d %2d %2d %2d\n",a[11],a[18],a[19],a[15],a[5]); printf(" %2d %2d %2d %2d\n",a[10],a[17],a[16],a[6]); printf(" %2d %2d %2d\n",a[9],a[8],a[7]); printf("\n"); }

 

六角幻方 C语言

标签:

原文地址:http://www.cnblogs.com/lhy1024/p/5205348.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!