/************************************************
* File name :magic_square.c
* CopyRight :2011-03-25,All rights Reserved.
* Module name :...
*
* CPU :ARM7
* RTOS :....
*
* Create Date :2011-03-25
* Author/Corporation: hackerling/maple Corporation
*
* Abstract Description :
*
*
* ---------------Revision History--------------
* No Version Date Revised By Item *
* 1 1.0 2011-3-25 王小毛 *
奇階魔方陣的程序,已調試成功
注:這是個老程序了,很多人都會寫,我很菜,好久沒玩C了,最近學習了陳正衝老師的《c語言深度解剖》,很不錯的一本書,推薦閱讀!!!
故寫了一些小程序,僅當聯繫,奇階魔方陣是實現從1到n*n的自然數,形成一個矩陣,使每行每列都加起來爲一個固定的數,都相等.
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
//魔方陣的入口函數,實現每行每列之和相加全等
void main() //聲明變量不會分配內存,c++中默認初始值爲-858993460
{
int magicsqr[MAXSIZE][MAXSIZE]; //魔方陣數組
int i,j; //做數組下表的處理
int num; //num就是用來作爲要填充的具體數據
int n; //n表示你輸入的魔方陣階數
for(i=1;i<MAXSIZE;i++) //對數組做初始化,爲了下面所做的判斷,需要注意的是下標爲0行與列不能初始化爲0
{
for(j=1;j<MAXSIZE;j++)
{
magicsqr[i][j]=0;
}
}
printf("Please input n(1~19,It must be odd):");
scanf("%d",&n);
while(!(n>0 && n< MAXSIZE) || n%2==0) //輸入數據限制
{
printf("The number you input is invalid,please input agian!");
scanf("%d",&n);
}
j=n/2+1;
magicsqr[1][j]=1;
i=1;
for(num=2;num<n*n+1;num++)
{
i=i-1; //規則1:普通輸入規則,加入到上一行的右一列
j=j+1;
if(i==0&&j==n+1) //規則2:對數組下表進行處理if-else結構,如果越界,即不在本數組下方
{
i=i+2;
j=j-1;
}
else //規則3:其餘的單邊越界(所謂單邊越界:就是說或者行或者列超過了魔方陣數組屆)
{
if(i==0) {i=n;}
if(j==n+1) {j=1;}
}
if(magicsqr[i][j]==0) //數據寫入魔方陣,if-else結構
{
magicsqr[i][j]=num;
}
else //規則4:如果該數在輸入下一個要填入的數字時,它的右上角存在數字,即不爲0,作如下處理,放在它自己下方
{
i=i+2;
j=j-1;
magicsqr[i][j]=num;
}
}
for(i=1;i<n+1;i++) //輸出魔方陣
{
for(j=1;j<n+1;j++)
{
printf("%4d",magicsqr[i][j]);
}
printf("\n\n");
}
return;
}