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”);

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306302.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論