編程解魔方
A. 請大家幫我講解一下數學中魔方陣的規律.並用編程解一下.
魔方陣,古代又稱「縱橫圖」,是指組成元素為自然數1、2…n的平方的n×n的方陣,其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等。
如3×3的魔方陣:
8 1 6
3 5 7
4 9 2
魔方陣的排列規律如下:
(1)將1放在第一行中間一列;
(2)從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1(例如上面的三階魔方陣,5在4的上一行後一列);
(3)如果上一個數的行數為1,則下一個數肢租薯的行數為n(指最下一行);例如1在第一行,則2應放在最下一行,列數同樣加1;
(4)當上一個數的列數為n時,下一個型備數的列數應為1,行數減去1。例如2在第3行最後一列,則3應放在第二行第一列;
(5)如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。例如按上面的規定,4應該放在第1行第2列,但該位置已經被占據,歷者所以4就放在3的下面;
#include<stdio.h>
int main()
{int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{printf("enter n(n=1--15);");
scanf("%d",&n);
if((n!=0)&&(n<15)&&(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[i][j]=1;
for(k=2;k<=n*n;k++)
{i=i-1;
j=j+1;
if((i<1)&&(j>n))
{i=i+2;
j=j-1;
}
else
{if(i<1) i=n;
if(j>n) 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++)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
B. 如何用c語言編程使三階幻方不等
這個列印n階的 0<n<=15是奇數 我在下面幫你改了個3階的
/* bookp33.c 列印魔方陣程序 */
/* 譚浩強,C程序設計題解與上機指導,33頁 */
/* 在tc30下編譯通過 */
/* 2001.12.12 */
void main()
{
int a[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{ printf("請輸入n.(0<n<=15,n是奇數.)\n");
scanf("%d",&n);
if((n>=0)&&(n<=15)&&(n%2!=0))
{ printf("矩陣階數是:%d\n",n);
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((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) 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++)
printf(" %3d",a[i][j]);
printf("\n");
}
}
*************3階的************
int main()
{
int a[16][16],i,j,k,n;
n=3;
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((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{if(i<1) i=n; if(j>n) 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++)
printf(" %3d",a[i][j]);
printf("\n");
}
return (1);
}
C. 求魔方的演算法 我指的是計算機編程演算法 最好有C++ 或C#的源代碼
具體做法:
方法一;
/*此程序使我按照上面介紹的魔方陣的規律編寫的,不過只能求奇數魔方陣,經過測試可以算到508階*/
#define N 7
#include<stdio.h>
void main()
{
int a[N][N],i,j,k;
for(i=0;i<N;i++) /*先處理第一行*/
for(j=0;j<N;j++)
{
a[i][j]=0; /*先令所有元素都為0*/
}
j=(N-1)/2; /*判斷j的位置*/
a[0][j]=1; /*將1放在第一行中間一列*/
for(k=2;k<=N*N;k++) /*再從2開始處理*/
{
i=i-1; /*存放的行比前一個數的行數減1*/
j=j+1; /*存放的列比前一個數的列數加1*/
if((i<0)&&(j==N)) /*前一個數是第一行第N列時,把下一個數放在上一個數的下面*/
{
i=i+2;
j=j-1;
}
else
{
if(i<0) /*當行數減到第一行,返回到最後一行*/
i=N-1;
if(j>N-1) /*當列數加到最後一行,返回到第一行*/
j=0;
}
if(a[i][j]==0) /*如果該元素為0,繼續執行程序*/
a[i][j]=k;
else /*如果該元素不為0,就說明要填的數的位置已經被占,則該數放在上一個數的下面*/
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=0;i<N;i++) /*輸出數組*/
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
方法二:
/*這個是網友qfyzy為幫助我找錯而提供的,可以算到99階*/
#define N 7
#include<stdio.h>
void main()
{
int a[N][N]={0},i=0,j,k; /*先令所有元素都為0*/
j=(N-1)/2;
i=0;
for(k=1;k<=N*N;) /*開始處理*/
{
if((i<0)&&(j==N)) /*前一個數是第一行第N列時,把下一個數放在上一個數的下面*/
{
i=i+2;
j=j-1;
}
else if(i<0) /*當行數減到第一行,返回到最後一行*/
i=N-1;
else if(j>N-1) /*當列數加到最後一行,返回到第一行*/
j=0;
else if(!a[i][j]){ /*如果該元素為0,繼續執行程序*/
a[i][j]=k++;
i=i-1;
j=j+1;
}
else /*如果該元素不為0,就說明要填的數的位置已經被占,則該數放在上一個數的下面*/
{
i=i+2;
j=j-1;
}
}
for(i=0;i<N;i++) /*輸出數組*/
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}