您的位置:

python魔方阵分析,n阶魔方阵python

本文目录一览:

算法设计与分析:3阶魔方阵

1、累加和=所有数字和/行数=(1+n2)*n2/2n=n(n2+1)/2

2、这叫幻方

3、奇数阶幻方有构造方法:

从1开始,往右斜上顺次填写。

特殊情况:如果数字出了幻方,将该数填至行或列的另一端。

特殊情况2: 如果要填写的格子被占了,数填在格子下方一格。

特殊情况3: 我忘了。

:魔方阵

程序1. 完整程序输出,可以输出任意数的魔方矩阵

#include stdio.h

#include math.h

#define N 100 /*N可以改变*/

void main()

{

int n,p=1;

void jici(int n);

void sibeishu(int n);

void elseoushu(int n);

printf("***说明(本程序用于输出任意数阶次的魔方矩阵,其行,列,对角线之和的均值相同。)\n");

printf(" ***说明(最右边的,和最下边的用于统计每行,每列的元素之和 。) \n\n");

printf(" 请输入一个要求阶次的魔方矩阵的边长(2~%d): ",N);

while(p)

{

scanf("%d",n);

if((n1)(n=N))

p=0;

}

if(fabs((n-1)%2)1e-006)

jici(n);

else

if(fabs((n%4))1e-006)

sibeishu(n);

else

elseoushu(n);

}

void jici(int n)

{

int a[N][N]={0};

int i,j,k,sum;

i=0;

j=(n-1)/2;

a[0][j]=1;

for(k=2;k=n*n;k++)

{

i=i-1;

j=j+1;

if((i0)(jn-1))

{

i=i+2;j=j-1;

}

else

{

if(i0) i=n-1;

if(jn-1) j=0;

}

if(a[i][j]==0) a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

sum=0;

for(i=0,j=0;in;i++,j++)

{

sum=sum+a[i][j];

}

a[n][n]=sum;

for(i=0;in;i++)

{

sum=0;

for(j=0;jn;j++)

sum=sum+a[i][j];

a[i][n]=sum;

}

for(j=0;jn;j++)

{

sum=0;

for(i=0;in;i++)

sum=sum+a[i][j];

a[n][j]=sum;

}

for(i=0;in+1;i++)

{

for(j=0;jn+1;j++)

printf("%5d",a[i][j]);

printf("\n\n");

}

}

void sibeishu(int n)

{

int a[N][N]={0};

int k,t,i,j,sum;

k=1;

for(i=0;in;i++)

for(j=0;jn;j++)

{

a[i][j]=k;

k++;

}

for(i=0,j=0;in/2;i++,j++)

{

t=a[i][j];

a[i][j]=a[n-1-i][n-1-j];

a[n-1-i][n-1-j]=t;

}

for(i=0,j=n-1;in/2;i++,j--)

{

t=a[i][j];

a[i][j]=a[n-1-i][n-1-j];

a[n-1-i][n-1-j]=t;

}

sum=0;

for(i=0,j=0;in;i++,j++)

{

sum=sum+a[i][j];

}

a[n][n]=sum;

for(i=0;in;i++)

{

sum=0;

for(j=0;jn;j++)

sum=sum+a[i][j];

a[i][n]=sum;

}

for(j=0;jn;j++)

{

sum=0;

for(i=0;in;i++)

sum=sum+a[i][j];

a[n][j]=sum;

}

for(i=0;in+1;i++)

{

for(j=0;jn+1;j++)

printf("%5d",a[i][j]);

printf("\n\n");

}

}

void elseoushu(int n)

{

int a[N][N]={0};

int m,k,i,j,sum,u,t,h;

m=n/2;

i=0;

j=(m-1)/2;

a[0][j]=1;

for(k=2;k=m*m;k++)

{

i=i-1;

j=j+1;

if((i0)(jm-1))

{

i=i+2;j=j-1;

}

else

{

if(i0) i=m-1;

if(jm-1) j=0;

}

if(a[i][j]==0) a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

i=0;

j=(m-1)/2+m;

a[i][j]=m*m*2+1;

for(k=m*m*2+2;k=m*3*m;k++)

{

i=i-1;

j=j+1;

if((i0)(jm*2-1))

{

i=i+2;

j=j-1;

}

else

{

if(i0) i=m-1;

if(jm*2-1) j=m;

}

if(a[i][j]==0) a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

i=m;

j=(m-1)/2;

a[i][j]=m*m*3+1;

for(k=m*m*3+2;k=m*4*m;k++)

{

i=i-1;

j=j+1;

if((im)(jm-1))

{

i=i+2;j=j-1;

}

else

{

if(im) i=m*2-1;

if(jm-1) j=0;

}

if(a[i][j]==0) a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

i=m;

j=(m-1)/2+m;

a[i][j]=m*m+1;

for(k=m*m+2;k=2*m*m;k++)

{

i=i-1;

j=j+1;

if((im)(jm-1+m))

{

i=i+2;

j=j-1;

}

else

{

if(im) i=m*2-1;

if(jm*2-1) j=m;

}

if(a[i][j]==0) a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

t=(n+2)/4;u=n/2;

for(j=0;jt-1;j++)

for(i=0;im;i++)

{

h=a[i][j];

a[i][j]=a[i+m][j];

a[i+m][j]=h;

}

for(j=n-t+2;jn;j++)

for(i=0;im;i++)

{

h=a[i][j];

a[i][j]=a[i+m][j];

a[i+m][j]=h;

}

{

h=a[t-1][0];

a[t-1][0]=a[t+u-1][0];

a[t+u-1][0]=h;

}

{

h=a[t-1][t-1];

a[t-1][t-1]=a[t+u-1][t-1];

a[t+u-1][t-1]=h;

}

sum=0;

for(i=0,j=0;in;i++,j++)

{

sum=sum+a[i][j];

}

a[n][n]=sum;

for(i=0;in;i++)

{

sum=0;

for(j=0;jn;j++)

sum=sum+a[i][j];

a[i][n]=sum;

}

for(j=0;jn;j++)

{

sum=0;

for(i=0;in;i++)

sum=sum+a[i][j];

a[n][j]=sum;

}

for(i=0;in+1;i++)

{

for(j=0;jn+1;j++)

printf("%5d",a[i][j]);

printf("\n\n");

}

}

高手提示一下

//分析:魔方阵有如下规律:

// 1:自然数1总是在方阵第一行当中一列上。

// 2:后续的自然数在当前数的右上方,

// 1)如果是在第一行则行数变为第n行列数加1 ;

// 2)如果是在最后一列,行数减1,列数为第1行。

// 3)如果后续的数所处位置已有数,则行数加1,列数不变。

/******************************************************************************************************************************

巧填奇数阶幻方(魔方阵)[转]2007-01-03 17:57 一、什么叫幻方?

(通俗点说)把一些有规律的数填在纵横格数都相等的正方形图内,使每一行、每一列和每一条对角线上各个数之和都相等。这样的方阵图叫做幻方。

幻方又分为奇数阶幻方和偶数阶幻方。奇数阶幻方是指横行、竖列都是单数(即3、5、7、9……)的方阵图。偶数阶幻方是指横行、竖列都是双数(即4、6、8、10……)的方阵图。

二、奇数阶幻方的填法。

奇数阶幻方中最简便的一种就是三阶幻方,又称“九宫图”。

平常我们遇到这类题都是用分析、分组、尝试的方法推出,这种方法较麻烦,如果是五阶幻方、七阶幻方就更困难了。

有一种方法不仅能很快地填出三阶幻方,还能很快地填出五阶幻方、七阶幻方、九阶幻方……那就是“口诀法”

口 诀

“1”坐边中间,斜着把数填;

出边填对面,遇数往下旋;

出角仅一次,转回下格间。

注意:

(1)这里的“1”,是指要填的这一列数中的第一个数。

(2)“1”坐边中间,指第一个数要填在任何一边的正中间的空格里。

(3)从1到2时,必须先向边外斜(比如:第一个数填在上边的正中间,填第二个数时,要向左上方或右上方斜),填后面的数时也要按照同样的方向斜。

*******************************************************************************************************************************/

#includeiostream

using namespace std;

void main()

{

int a[32][32],i,j,k,p,n;

p=1;

while(p==1)

{

cout"Enter n(n=1~25):";

cinn;

if((n!=0)(n=25)(n%2!=0))

p=0;

}

for(i=1;i=n;i++)

for(j=1;j=n;j++)

a[i][j]=0;

j=n/2+1;

a[1][j]=1;

for(k=2;k=n*n;k++)

{

i=i-1;

j=j+1;

if((i1)(jn))

{

i=i+2;

j=j-1;

}

else

{

if(i1)

i=n;

if(jn)

j=1;

}

if(a[i][j]==0)

a[i][j]=k;

else

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

for(i=1;i=n;i++)

{

for(j=1;j=n;j++)

couta[i][j]" ";

coutendl;

}

}

/*C_ban*

所谓的魔方距阵就是一种特殊的奇数阶方阵:它的行,列,对角线,上的数字之和都要相等,且方阵中的每一个数字都不相等,且数字的范围都在1到n*n之间.

我编的程序如下:

*/

#includestdio.h

#define N 15

main()

{

int i,j,row,cloum,size,square[N][N],count;

clrscr();

printf("please enter the square size(odd =15):\n");

scanf("%d",size);

while(size%2==0||size15||size3)

{

printf("error due to the wrng input!please input it again!\n");

scanf("%d",size);

}

for(i=0;isize;i++)

for(j=0;jsize;j++)

square[i][j]=0;

i=0;j=(size-1)/2;

square[i][j]=1;

for(count=2;count=size*size;count++)

{

row=i-10?(size-1):(i-1);

cloum=j-10?(size-1):(j-1);

if(square[row][cloum])

i=(++i)%size;

else

{i=row;

j=j-10?(size-1):(j-1);

}

square[i][j]=count;

}

printf("the %d square is:\n",size);

for(i=0;isize;i++)

{

for(j=0;jsize;j++)

printf("%d",square[i][j]);

printf("\n");

}

}

只能求奇数的魔方阵

#define N 20

main()

{

int a[N][N];

int n,i,j,r;

scanf("%d",n);

for(i=0;iN;i++) for(j=0;jN;j++) a[i][j]=0;

i=0;

j=n/2;

a[i][j]=1;

for (r=2;r=n*n;r++)

if (a[(i+n-1)%n][(j+1)%n]==0)

{i=(i+n-1)%n;j=(j+1)%n;a[i][j]=r;}

else

{i=(i+1)%n;a[i][j]=r;}

for(i=0;in;i++)

{

for(j=0;jn;j++) printf("%4d",a[i][j]);

printf("\n");

}

}

python语言怎么编写魔方阵

#!/usr/bin/env python

#-*- coding:utf-8 -*-

'''

8 1 6

3 5 7

4 9 2

author:summer

date :2011.11

'''

def myMatrix(n):

n=int(n)

assert n%2!=0,"Please Enter a odd :number%2!=0"

mydict={num:[0,0] for num in range(1,n*n+1)}

mylist=[]

for i in range(n):mylist.append([0 for x in range(n)])

mydict[1]=[0,n/2]

mylist[0][n/2]=1

for i in range(2,n*n+1):

x,y=mydict[i-1][0],mydict[i-1][1]

mydict[i][0]=x-1

mydict[i][1]=y+1

if x==0:

mydict[i][0]=n-1

if y==n-1:

mydict[i][1]=0

if mylist[mydict[i][0]][mydict[i][1]]:

mydict[i][0]=x+1

mydict[i][1]=y

x,y=mydict[i][0],mydict[i][1]

mylist[x][y]=i

return mylist

if __name__=='__main__':

num=input("Enter a odd: ")

for line in myMatrix(num):

print line,"\n"

求九宫问题程序(C语言实现)

【转】

/*九宫图算法说明:根据分析,九宫图中间一位一定是5,另外关于中间位置

对称的每两个数字相加等于10,所以对于一个九宫图只通过其相邻位置的数

字就能计算出其他所有位置的数字,而且相邻位置的数字必然一个比5大,一

个比5小

算法设计思想:先根据选取规则,从剩下八个数里面选一大一小,再使用目

标函数检测选取是否正确,如果正确则打印出,否则重新选取,选数的过程

使用回溯法*/

#includestdio.h

int place(int*);

void main(void){/*九宫图算法*/

int a[9]={1,2,3,4,5,6,7,8,9};

int b[9]={0};/*表示数字的位置状态*/

int j,k,i;

for(k=0;k=3;k++){/*对于所有比5小的数*/

b[1]=a[k];/*选一比5小的数放到第一行第二列*/

for(j=8;j=5;j--){/*对于所有比5大的数*/

if(k!=(8-j)){/*不选择前面已选小数所对应的大数*/

b[0]=a[j];/*选一比5大的数放到第一行第一列*/

if(place(b)){/*若得到一解,则打印出*/

printf("\n 九宫图\n\n");

for(i=0;i=8;i++){

printf(" %d ",b[i]);

if((i+1)%3==0){

printf("\n\n\n");

}

}

getch();

exit(0);

}

} /* 回溯到上一级*/

} /*回溯到根一级 */

}

}

int place(int*p){ /*计算出其他位置的数字并检测是否为所求的解*/

p[2]=15-p[0]-p[1];

p[4]=5;

p[6]=10-p[2];

p[3]=15-p[0]-p[6];

p[5]=10-p[3];

p[7]=10-p[1];

p[8]=10-p[0];

if(p[2]+p[5]+p[8]==p[6]+p[7]+p[8]){/*其他行和列已通过计算检测了,只有第三行,第三列未检测*/

return(1);

}

else{

return(0);

}

}

【转】

///////////////////////////////////////

// 九宫图算法;

//////////////////////////////////////

#includesio.h

#includetime.h

#includeslib.h

//////////////////////////////////

//// the function defination

//////////////////////////////////

void create(int [][3]);

void show(int [][3]);

void set_value(int [][3]);

void aim_get(int [][3]);

void target(int [][3]);

void judge_x1(int [][3]);

void judge_x2(int [][3]);

void judge_x3(int [][3]);

void judge_x4(int [][3]);

void judge_x5(int [][3]);

void shift_all(int [][3]);

void shift_low_six(int [][3]);

void anti_shift_all(int [][3]);

void shift_low_four(int [][3]);

void last_shift(int [][3]);

void set_x5(int [][3]);

///////////////////////////////////////

////// the main function body ////

////////////////////////////////////////

main()

{

srand(time(NULL));

int cDiagram[3][3];

create(cDiagram); /////// creat the new array ,set the value are 10;

set_value(cDiagram);

//last_shift(cDiagram);

return 0;

}

///////////////////////////////////////

/// 建立一个3*3数组,初值都设为10;//

//////////////////////////////////////

void create(int array[][3])

{

printf("\n\n***********************************\n\n");

printf("九宫图算法实现过程\n\n");

printf("***********************************\n\n");

int line;

int row;

for(line=0;line3;line )

{

for(row=0;row3;row )

{

array[line][row]=10;

}

}

// set_value(array);

//show(array);

}

/////////////////////////////////////////

/// 显示数组状态 ////

////////////////////////////////////////

void show(int array[][3])

{

for(int i=0;i3;i )

{

for(int j=0;j3;j )

{

printf("=",array[i][j]);

}

printf("\n\n");

}

}

///////////////////////////////

/// 产生数组的初始状态 ///////

///////////////////////////////

void set_value(int array[][3])

{

int i=0;

int rand_num_line;

int rand_num_row;

printf(" \n\n九宫图的初始值为:\n\n");

while(i=8)

{

rand_num_line=rand()%3;

rand_num_row=rand()%3;

if(array[rand_num_line][rand_num_row]!=i array[rand_num_line][rand_num_row]==10)

{

array[rand_num_line][rand_num_row]=i;

i;

}

}

show(array);

//printf(" let's begin!!\n");

aim_get(array);

}

////////////////////////////////////////////////////////

//// judge the initial array get the target or no ! ///

//////////////////////////////////////////////////////////

void aim_get(int array[][3])

{

int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};

int line;

int row;

int judge=0;

for(line=0;line3;line )

{

for(row=0;row3;row )

{

if(array[line][row]!=aim[line][row])

{

judge=1;

}

}

}

if(judge==1)

{

judge_x1(array);

}

else

{

target(array);

}

}

/////////////////////////////////////

/////// the target diagram //////////

/////////////////////////////////////

void target(int array[][3])

{

printf("\n\n the last diagram is :\n");

show(array);

}

////////////////////////////////////

///judge the x1 is 1 or no! ///////

////////////////////////////////////

void judge_x1(int array[3][3])

{

//int x1=1;

int temp;

//printf(" \n\n\n the array[0][2]=%d\n\n",array[0][2]);

if(array[0][2]!=1 array[0][2]!=0) // x3!=1 || x3!=0;

{

while(array[0][0]!=1)

{

//printf("i am here!!1");

temp=array[0][0];

array[0][0]=array[0][1];

array[0][1]=array[1][1];

array[1][1]=array[1][2];

array[1][2]=array[2][2];

array[2][2]=array[2][1];

array[2][1]=array[2][0];

array[2][0]=array[1][0];

array[1][0]=temp;

}

}

else

{

if(array[0][2]==0) // x3==0;

{

// printf("\n\n array[0][2]=0\n\n");

temp=array[0][2];

array[0][1]=array[0][2];

array[0][2]=temp;

judge_x1(array);

goto tt;

}

else /// x3==1;

{ //printf("\n\narray[0][2] should is 1, %d",array[0][2]);

if(array[1][1]==0) //// x0==0;

{

temp=array[0][1];

array[0][1]=array[1][1];

array[1][1]=temp;

judge_x1(array);

}

else //// x3==1 x0!=0;

{

shift_all(array);

judge_x1(array);

}

}

}

printf(" 确定了X1位置后,九宫图为:\n");