當前位置:首頁 » 編程軟體 » 編程解魔方

編程解魔方

發布時間: 2023-05-25 01:21:26

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");
}
}

熱點內容
格來雲伺服器到期 發布:2025-02-14 06:48:43 瀏覽:904
訂奧迪A7哪個配置比較好 發布:2025-02-14 06:44:23 瀏覽:139
spss的資料庫 發布:2025-02-14 06:37:32 瀏覽:119
sql除法運算 發布:2025-02-14 06:30:43 瀏覽:534
如何在家部署一台伺服器 發布:2025-02-14 06:22:04 瀏覽:433
u盤里文件夾是空的 發布:2025-02-14 06:13:22 瀏覽:803
安卓如何縮放圖片尺寸 發布:2025-02-14 06:06:34 瀏覽:116
六年級簡便演算法題 發布:2025-02-14 05:53:02 瀏覽:8
腳本精靈要root嗎 發布:2025-02-14 05:51:30 瀏覽:212
安卓手機如何錄屏怎麼去掉觸摸顯示 發布:2025-02-14 05:36:23 瀏覽:996