本文目录一览:
- 1、算法设计与分析:3阶魔方阵
- 2、:魔方阵
- 3、高手提示一下
- 4、python语言怎么编写魔方阵
- 5、求九宫问题程序(C语言实现)
算法设计与分析: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");