写出程序填写出N*N“魔方阵”的数值。所谓魔方阵是指这样的方阵,数据是正整数,从1开始,每个递增1,每个数据不重复出现,它的每一行、每一列和对角线之和均相等(N是奇数)。
17 24 01 08 15 23 05 07 14 16 04 06 13 20 22 10 12 19 21 03 11 18 25 02 09
规则: (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 "stdafx.h" #include<stdio.h> #include<stdlib.h> int Magic_matrix(int n); int _tmain(int argc, _TCHAR* argv[]) { int get_dim = 0; bool right_dim = false; int finish = 0; //获取维数并检查数据 while(right_dim == false) { get_dim = 0; printf("/nPlease input the Dimension of the Magic matrix:/n"); scanf("%d",&get_dim); if(get_dim > 0 && get_dim < 20 && get_dim%2) { right_dim = true; } else { printf("/n[ WARNING! ]You input a magic number,please try it again/n"); } } //调用函数 if( Magic_matrix(get_dim) ) { printf("sorry ,please try it again!/n"); } printf("/nPress any key to continue...."); getchar(); return 0; } int Magic_matrix(int n) { int dimension = n; //维数 int max_ele = n * n ; //元素个数 int count = 1; //计数器 int row ; //行 int list ; //列 int **M_matrix = NULL; //一维空间申请 M_matrix = (int **)malloc( dimension * sizeof(int) ); if(M_matrix == NULL) { printf("memery request error!/n"); return 1; } //二维空间申请 for(int i = 0 ; i < dimension ; i++) { M_matrix[i] = (int *)malloc( dimension * sizeof(int) ); if(M_matrix[i] == NULL) { printf("memery request error!/n"); return 1; } } //动态数组初始化成0 for(int i = 0 ; i < dimension ; i++) { for(int j = 0 ; j < dimension ; j++) { M_matrix[i][j] = 0; } } //----------------实现功能---------------- //将1放在第一行中间一列 row = 0; list = dimension / 2; M_matrix[row][list] = 1 ; count++; //确定其他元素的值 while( count < max_ele +1 ) { //定位 row = (row-1 + dimension ) % dimension; list = (list+1 + dimension ) % dimension; if(M_matrix[row][list] == 0) { M_matrix[row][list] = count; count++; } else { row = (row + 3 + dimension ) % dimension;//+3:抵消上面减去1,为了下一个循环执行row = (row-1 + dimension ) % dimension; list = (list - 2 + dimension ) % dimension;//-2 为了保证下一循环执行后list值与本循环之前的list值相同 } } //打印结果 for(int i = 0 ; i < dimension ; i++ ) { printf("/n"); for(int j = 0 ; j < dimension ; j++ ) { printf("%-4d",M_matrix[i][j]) ; } } getchar(); return 0; }