奥数九宫格怎么分析(奥数中九宫算升级版)
奥数九宫格怎么分析(奥数中九宫算升级版)
2024-11-22 01:56:11  作者:硬帅痞  网址:https://m.xinb2b.cn/life/uyk470221.html

九宫算是指在3*3个方格中,每个方格分别放入1个数,这个数必须是1-9中之一,每个数必须而且只能放入一次。要求3*3方格中每一行、每一列、两条对角线的三个数之和都相等。

五阶幻方是指在5*5个方格中,每个方格各放入一个数,这个数必须是1-25中之一,每个数必须而且只能放入一次。要求5*5方格中每一行、每一列、两条对角线的五个数之和都相等。

原以为奇数阶幻方中,正中间的方格应该填入数列中的中位数,例如在3阶幻方中,正中间的方格应该填入9,但是在5阶幻方中,这个假设就失效了,下面是具体的例子。



正中间的单元格一个是10,一个是9,都不是13。

下面的这个例子是从网上找到的五阶幻方求解的源程序,采用逐步搜索的方法,求得所有解。我最长运行了3小时,求得了大约29万种不同解,不知道全部有效解一共是多少?

#include "stdio.h"#define LENGTH 10#define SIZE LENGTH*LENGTHinta[LENGTH][LENGTH],b[SIZE],degree,number=0,max,sum;int main(){int i=0,j=0,m,temp,n,x,k,y,h,z;printf("please input a degree:");scanf("%d",°ree);max=degree*degree;sum=(max 1)*degree/2;for(i=1;i<=degree;i ){b[i]=0;//1-5标记为没有选中,因为0不是目标数字,所以i从1开始//b[]可能代表某一行的5个数for(j=0;j<degree;j ){a[i-1][j]=0;//目标数组全部置为0,行标从0开始,列标也从0开始}}//全部赋0值i=j=z=0;while(1)//大循环开始{temp=a[i][j];a[i][j]=0;//把a[i][j]读出来,赋值给temp,然后将a[i][j]置为0//a[][]为目标数组for(m=temp 1 z,z=0;m<=max;m ){if(b[m]==0){if(temp!=0){b[temp]=0;temp=0;}if(i<degree-2 && j<degree-2)//是否进入第三行、第三列{if(i==degree-3)//行判断,是不是第三行{for(n=0,x=0;n<i;n ){x =a[n][j];}x =m;//x为已知数的和k=sum-x;//K为剩余数的和if(k>max max-1 || (k==max max-1 && (b[max]==1 || b[max-1]==1)))//剩余的数字已无可能{continue;}if(k<3 || (k==3 && (b[1]==1 && b[2]==1)))//剩余的数字已无可能{m=max 1;break;}}if(j==degree-3) //列判断,是不是第三列{for(n=0,x=0;n<j;n ){x =a[i][n];//x为该行已选数字之和}x =m;//m为该行第三列待选数字k=sum-x;//某列已选好的数字求和,没选的数字求和if(k>max max-1 || (k==max max-1 && (b[max]==1 || b[max-1]==1)))//还剩2个数没有选,如果k值大于最大两个数之和,表示没有可能;如果等于最大两个数之和,但是最大两个数其中之一已经用过了,表示没有可能。{continue;}if(k<3 || (k==3 && (b[1]==1 && b[2]==1)))//最小情况判断,比3还小不可能,等于3但是1,2其中之一已被选择,也不可能{m=max 1;break;}}//将M赋值给数组a,同时标记数组b,该数字已使用a[i][j]=m;b[m]=1;j ;break;}if(j==degree-2)//该行已经选了3个数,准备选第四个数{for(n=0,x=0;n<j;n ){x =a[i][n];//前面的数求和}x =m;//和值加入dmk=sum-x;//剩余的值if(k>0 && k<=max && m!=k && b[k]==0)//剩余的值在最大和最小之间,m与k不相等,k值没有被选过{a[i][j]=m;b[m]=1;a[i][j 1]=k;b[k]=1;//最后2个数字,一起完成赋值if(i<degree-2)//如果还剩超过2行,则进入下一行{i ;j=0;break;}}else{if(i==degree-2 && j==1){j--;b[a[i 1][j]]=0;a[i 1][j]=0;break;}else{continue;}}}if(i==degree-2){//还剩2行for(n=0,x=0;n<i;n ){x =a[n][j];}x =m;k=sum-x;//前几行求和,另外得出剩下几行的和if(k>0 && k<=max && m!=k && b[k]==0){//k的值在最大]、最小之间,m、k对应的值没有被用过if(j<degree-2){if(j==0){for(n=0,x=degree-1,y=0;n<i;n ){y =a[n][x--];//对角线求和}y =k;h=sum-y;//对角线已选值的和,以及剩余的值的和if(h>0 && h<=max && h!=k && h!=m && b[h]==0){//对角线的判断a[i][j]=m;b[m]=1;a[i 1][j]=k;b[k]=1;z=h-1;//该行,和下一行的值复制j ;break;}else{continue;}}if(j==1){for(n=0,x=degree-1,y=0;n<i;n ){y =a[n][x--];}y =(a[degree-1][0] m);if(y!=sum){//值不满足65,重新归零b[a[degree-1][0]]=0;a[degree-1][0]=0;j--;break;}}a[i][j]=m;b[m]=1;a[i 1][j]=k;b[k]=1;j ;break;}else if(j==degree-2){for(n=0,x=0;n<=i;n ){x =a[n][n];}h=sum-x;if(h>0 && h<=max && h!=m && h!=k && b[h]==0){for(n=0,y=0;n<=j;n ){y =a[n][degree-1];}if(y==x){for(n=0,y=0;n<i;n ){y =a[degree-1][n];}y =k;if(y==x){a[i 1][j]=k;b[k]=1;a[i][j]=m;b[m]=1;a[ i][ j]=h;b[h]=1;}else{continue;}}else{continue;}}else{b[a[i][j 1]]=0;a[i][j 1]=0;b[a[i][j]]=0;a[i][j]=0;if(j==1){b[a[i 1][j-1]]=0;a[i 1][j-1]=0;j--;break;}else{continue;}}}}else{if(j==1){//这个判断好像无效if(j==degree-2){b[a[i][j 1]]=0;a[i][j 1]=0;}b[a[i][j]]=0;a[i][j]=0;j--;b[a[i 1][j]]=0;a[i 1][j]=0;break;}if(j==degree-2){b[a[i][j]]=0;a[i][j]=0;b[a[i][j 1]]=0;a[i][j 1]=0;//某列两个数值归0}continue;}}if(i==degree-1 && j==degree-1){//已经到达第5行、第五列for(k=0;k<degree;k ){for(h=0;h<degree;h ){//满足条件的结果输出printf("M",a[k][h]);}printf("\n");}printf("\n");number ;printf("num=]\n",number);if(number==100){getchar();getchar();}for(k=degree-2;k<degree;k ){for(h=1;h<degree;h ){b[a[k][h]]=0;a[k][h]=0;//第四行、第五行归0}}b[a[degree-1][0]]=0;a[degree-1][0]=0;//第五行第一列归0i--;j=0;break;}}}if(m>max){//超出理论范围if(temp!=0){b[temp]=0;}if(j==0 && i>0){i--;j=degree-1;b[a[i][j]]=0;a[i][j]=0;j--;}else if(j>0){j--;b[a[i 1][j]]=0;a[i 1][j]=0;}else if(i==0 && j==0){break;}}}printf("the total number is %d\n",number);//结果输出return 0;}

  • 这首歌献给特别的你(献给每个想要一了百了的你)
  • 2024-11-22献给每个想要一了百了的你你有没有曾经觉得人生灰暗?你有没有在某件事面前感到无能为力,只能抱头痛哭?你有没有曾经也想过要消失于世?我有过2017年的暑假,几乎是我人生中最灰暗的日子那个夏天,有人因为考上了理想的大学而喜极而泣但。
  • 红葡萄酒的制作方法(红葡萄酒如何制作)
  • 2024-11-22红葡萄酒如何制作首先要在合适的季节采摘酿酒葡萄,采摘后的葡萄被压碎或榨成汁,榨好的葡萄汁后则进行初次发酵,1-2周后葡萄汁需过滤果渣等沉淀物,接着添加酵母让葡萄汁中的糖分转化成酒精需要陈酿的葡萄酒在陈酿前需再次过滤老。
  • 杨紫和张家辉合作的电影(杨紫携手影帝张家辉)
  • 2024-11-22杨紫携手影帝张家辉对于很多90后的年轻人而言,杨紫是伴随着我们长大的明星,在《家有儿女》中的小雪依旧历历在目,昔日童星的杨紫也出落得亭亭玉立,转变成了实力小花旦而近日由实力花旦杨紫、影帝张家辉以及优秀艺人任贤齐主演的悬。
  • 这才是红烧大肠:红烧大肠下饭界大哥大
  • 2024-11-22这才是红烧大肠:红烧大肠下饭界大哥大将猪杂碎清洗干净放进大锅中焯水,撇除浮沫从新烧一锅水将猪杂碎放进锅中煮,放入A材料,大火煮开,30分钟后关火焖20分钟一锅香喷喷的猪杂碎就煮好了,趁热吃,美味将煮好的大肠切成斜刀,备用开火,放入干辣椒。
  • 四岁女孩老是喜欢夹腿(四岁的女儿爱夹腿)
  • 2024-11-22四岁的女儿爱夹腿对于现如今的家庭而言,谁家的孩子不是被捧在手心里当成宝一样的在守护呢,随着孩子的年龄成长,难免会有一些行为可能会让作为父母的难以理解,要知道在孩子四岁的时候,正是孩子一个小叛逆的时期,可能很多孩子的一。
  • 8月份黄道吉日乔迁(8月份乔迁乔迁及禁忌)
  • 2024-11-228月份乔迁乔迁及禁忌8月份搬家黄道吉日:公历2021年8月4日,农历2021年六月廿六,冲虎(戊寅)煞南宜:嫁娶、祭祀、祈福、求嗣、出火、拆卸、修造、动土、进人口、开市 交易、立券、挂匾、搬家、移徙、栽种、纳畜、入殓、启。
  • 命可以怎么讲(命是什么可以不要么)
  • 2024-11-22命是什么可以不要么命是我们灵魂的载体,是我们头脑和心灵的安放地,怎么可以不要?这不是痴人说梦吗?生命对于我们每个人都只有一次,当我们回首往事的时候,不要因为碌碌无为而难受,也不要因为虚度光阴而自责这是我们保尔·柯察金的。
  • 虹猫蓝兔七侠传最后一剑名称(虹猫蓝兔七侠传)
  • 2024-11-22虹猫蓝兔七侠传虹猫蓝兔七侠传:七剑合璧无敌,为什么只有合璧后才出现下一剑?虹猫蓝兔七侠传是很多漫迷喜欢的动漫作品,深受漫迷们的喜欢这是一部富含中国元素的动漫作品,武侠风很重很多漫迷说这是一部漫画作品,实际上逍遥君认。
  • 鸡蛋炒米线如何做(鸡蛋炒米线做法)
  • 2024-11-22鸡蛋炒米线做法主料:米线适量辅料:鸡蛋2个、白菜叶数片配料:生抽适量将白菜切碎米线焯水过冷水,加几滴油搅拌均匀起油锅,滑熟鸡蛋下白菜炒至断青加入米线炒匀,下适量的生抽调味香喷喷又简单的鸡蛋炒米线出锅了。
  • 宝宝起名字有诗意有涵养女孩(希世之才的女孩名字精选)
  • 2024-11-22希世之才的女孩名字精选家里诞生了一个新生命,就是一个家庭最美好的希望,所有的家长都会希望自己的宝宝能够前程似锦,拥有璀璨的人生,所以这里就分享女孩子前程似锦的名字#宝宝起名##取名#寓意前程似锦的女宝宝名字就分享到这了。
  • 张婧仪为啥管周迅叫姑(张婧仪叫周迅为姑姑)
  • 2024-11-22张婧仪叫周迅为姑姑说起张婧仪想必大家还不认识,凡是有看过《犬少年的天空》的小伙伴就一定知道她在剧中饰演李安然,她的演技也是十分出色,剧里把少女的心思都展示在大众面前,面对喜欢的人勇敢去行动的决策力让人感动,她现在正就读。