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

魔方編程c

發布時間: 2023-08-08 17:57:09

c語言中魔方陣編程的思路

/*
所謂魔方陣是指這樣的的方陣:
它的每一行、每一列和對角線之和均相等。
輸入n,要求列印由自然數1到n2的自然數構成的魔方陣(n為奇數)。
例如,當n=3時,魔方陣為:
8 1 6
3 5 7
4 9 2
魔方陣中各數排列規律為:
① 將「1」放在第一行的中間一列;
② 從「2」開始直到n×n為止的各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數同樣加1;
③ 如果上一數的行數為1,則下一個數的行數為n(最下一行),如在3×3 方陣中,1在第1行,則2應放在第3行第3列。
④ 當上一個數的列數為n時,下一個數的列數應為1,行數減1。如2在第3行第3列,3應在第2行第1列。

⑤如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。

如按上面的規定,4應放在第1行第2列,但該位置已被1占據,所以4就放在3的下面。由於6是第1行第3列(即最後一列),故7放在6下面。
*/

#include"stdio.h"

void main()
{
int i,n=5;
printf("---------------列印魔方陣-------------\n\n");
int a[5][5];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;//初始化

i=0;
int j=n/2;
int t=1;
int si=0;
int sj=0;//記錄上一個數的位置

while(t<=n*n)
{
//printf("\n%4d\n\n",t);
if(a[i][j]==0)
a[i][j]=t;

else
{
if(si==0 && sj==n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si!=n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}

if(si==n-1)
{
a[0][sj]=t;
i=0;
j=sj;
}
}

si=i;
sj=j;

/*計算下一個元素的位置*/
if(i==0)
i=n-1;
else
i=i-1;

if(j==n-1)
j=0;
else
j=j+1;

t=t+1;
}

for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}

}

❷ 魔方陣的C語言

代碼一:
#include <stdio.h>
#define N 16 //這里可以修改N的值,並且N只能為偶數
int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf(Enter n(1~%d): ,N-1);/*可以輸入小於等於N-1的奇數*/
scanf(%d,&n);
if((n!=0)&&(n<N)&&(n%2!=0)) p=0;
}
i=n+1;
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(%4d,a[i][j]);
printf( );
}
}
代碼二:(相對於代碼一條理更清晰,更簡單、更容易理解)
將1~n的平方這幾個數構成一個n階魔方陣。
演算法
依以下法則,你可以很快的寫出奇數階幻方!當然,這種寫法只是其中一個答案,而不是唯一答案。
1)將1填入第一行中間;
2)將每個數填在前一個數的右上方。
3)若該位置超出最上行,則改填在最下行的對應位置;
4)若該位置超出最右列,則該填在最左列的對應行位置;
5)若某元素填在第一行最右列,下一個數填在該數同列的下一行;
6)若某數已填好,但其右上角已填了其他數據,則下一個數填在該數同列的下一行位置。
#include<stdio.h>
void main()
{
int a[15][15]={0},i,j,m,n,temp,M;
printf(請輸入一個3~15的奇數: );
scanf(%d,&M);
i=0;
j=M/2;
a[i][j]=1;
for(temp=2;temp<=M*M;temp++)
{
m=i;
n=j;
i--;
j++;
if(i<0)
i=M-1;
if(j>M-1)
j=0;
if(a[i][j]!=0)
{
i=m+1,j=n;
a[i][j]=temp;
continue;
}
a[i][j]=temp;
}
printf(%d×%d魔方陣: ,M,M);
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf(%4d,a[i][j]);
printf( );
}
}
//(求4的倍數階幻方)
void main()
{
int i,j,x,y,n,t,k=1;
int a[100][100];
printf(請輸入魔方陣的階數n );
scanf(%d,&n);
printf(輸出為: );
if(n%4==0)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
x=n-1;
for(j=0;j<n/2;j++,x--)
{
for(i=0;i<n;i++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[i][x];
a[i][x]=t;
}
}
x=n-1;
for(i=0;i<n/2;i++,x--)
{
for(j=0;j<n;j++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[x][j];
a[x][j]=t;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf(%-4d,a[i][j]);
printf( );
}
}
else printf(輸入錯誤 );
system(pause...);
}

熱點內容
死鎖避免的演算法 發布:2025-02-05 04:43:07 瀏覽:579
python查文檔 發布:2025-02-05 04:27:49 瀏覽:496
javaxmldom 發布:2025-02-05 04:27:40 瀏覽:9
linux修改內存大小 發布:2025-02-05 04:26:05 瀏覽:997
ftp命令復制文件 發布:2025-02-05 04:26:00 瀏覽:303
python好用的ide 發布:2025-02-05 04:14:18 瀏覽:516
id密碼開頭是多少 發布:2025-02-05 04:11:51 瀏覽:101
數據結構c語言ppt 發布:2025-02-05 04:11:45 瀏覽:43
如何用學習機配置的筆寫字 發布:2025-02-05 04:09:15 瀏覽:395
5歲編程 發布:2025-02-05 04:06:21 瀏覽:653