C語言求所有四階幻方?小霸王木易2019-05-12 21:46:23

#include #include #include #define EVEN_DOUBLE_4 4 //雙偶的最基本型別,4階雙偶#define SCREEN_SIZE 19 //螢幕顯示不變形的最大尺寸(主要是因為視窗大小限制)#define MIN_SIZE 3 //最小階數為3#define MAX_SIZE 30/*原則上是任意階,演算法是相同的,這裡就以30為上限吧,當然如果你願意,可以修改的更大一些*/#define PRINT printf(“Esc退出,Enter繼續”); //列印的宏#define CLEAR row = 0; column = 0; //清零int Magic[MAX_SIZE][MAX_SIZE]={0}; //全域性,幻方陣列int row = 0; column = 0; //全域性,幻方的行列數int main(void){int read(); //讀取函式void odd(int size, int ini_value ); //奇數階幻方生成void mean_double_4(int size); //4階雙偶生成void mean_double(int size); //雙偶生成void mean_single(int size); //單偶生成void print_magic(int size); //列印幻方void sum_print(int data[], int size); //行、列、對之和列印void clear_sum(int data[]);void check_magic(int data[], int size ); //檢查所得矩陣是否為幻方陣int size; //幻方階數int sum[2*MAX_SIZE+2] = {0};//行、列、對之和do{CLEARclear_sum(sum);size=read();system(“cls”);if(size%2 != 0 ) odd(size, 0);else if(size %4 == 0) mean_double(size);else mean_single(size);print_magic(size);sum_print(sum, size);check_magic(sum,size);PRINT}while (getch() != 27);return 0;}/*讀入資料*/int read(){int min_size = MIN_SIZE;int max_size = MAX_SIZE;int size;do{printf(“請輸入幻方階數n,n∈[%d,%d]\n”, min_size, max_size);scanf(“%d”, &size);getchar();if(size<3 || size > MAX_SIZE) printf(“非法輸入,請重新輸入[%d,%d]的正整數\n”, min_size, max_size);else if(size > SCREEN_SIZE){printf(“大於屏顯最大階數,輸出將變形\n”);Sleep(2000);}}while(size < MIN_SIZE || size > MAX_SIZE);return size;}/*奇數階幻方,採用house法*/void odd(int size, int ini_value){int num; //填充數字int min_num = 1+ini_value;int max_num = 1+size*size+ini_value; //填充範圍int x = size/2;int y = 0; //初始填充座標for(num = min_num; num < max_num; num++){Magic[y+row][x+column] = num;if(num % size == 0) y++; //跳步else x++, y += 2; //馬步,其實Horse法和Siamese是完全類似的x = x % size ;y = y % size ;/*越界反彈,即觸碰到邊界,從另一邊返回*/}}/*雙偶數階幻方,採用對調法*//*對調法的基礎,4階雙偶。注意要求是將非主副對角線上的元素對調,其實換個角度,你也可以說就是把祝福對角線中心對調。只不過兩種思路得到的矩陣正好是反著來的*//*本函式實現主副對角線互調*/void mean_double_4(int size){int i;int total = size * size +1 ;for(i = 0; i < EVEN_DOUBLE_4; i++){Magic[row+i][column+i] = total - Magic[row+i][column+i];Magic[row+i][ EVEN_DOUBLE_4+column-i-1] =total - Magic[row+i][ EVEN_DOUBLE_4+column-i-1];}}/*任意階雙偶*/void mean_double(int size){int num; //填充數字int min_num = 1;int max_num = 1+size*size; //填充範圍int i = 0; //迴圈變數