本文目錄一覽:
- 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”);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306302.html