/*
魔术矩阵问题:魔术矩阵由一个n * n (n 为奇数)的整数矩阵构成, 矩阵中的整数值是从 1 ~ n*n ,
每一行,每一列和两个对角线上数值和是一样
考察算法的时间复杂度 , 不难发现这个程序最复杂的地方有三处,每一处由两个for循环嵌套而成,所以
每部程序的时间复杂度为O(n)* O(n) = O(n*n)整个程序的时间复杂度为O(n*n) + O(n*n) + O(n*n)
= O(n*n)
*/
1 #include <stdio.h>
2 //#include <stdlib.h>
3 #define Max_Size 15
4
5 void main(void)
6 {
7 static int square[Max_Size][Max_Size] ;
8 int i , j , row ,column , size , count ;
9 /*
10 {
11 printf("输入矩阵大小: \n");
12 scanf("%d" , &size);
13
14 if(size < 1 || size > Max_Size + 1)
15 {
16 printf("输入矩阵太大");
17 exit(1);
18 }
19 if(!(size%2))
20 {
21 printf("大小不能为偶数");
22 exit(1)
23 }
24 }
25 */
26
27
28 while(1)
29 {
30 printf("输入矩阵大小:");
31 scanf("%d" , &size);
32
33 if((size < 1 || size > Max_Size + 1) || !(size%2))
34 {
35 printf("输入矩阵太大或者大小不能为偶数,请重新");
36 }
37 else
38 break ;
39
40 }
41 for(i = 0 ; i < size ; i ++)
42 {
43 for(j = 0 ; j < size ; j ++)
44 {
45 square[i][j] = 0 ;
46
47 square[0][(size - 1)/2] = 1 ;
48
49 i = 0 ;
50 j = (size - 1)/2;
51
52 for(count = 2 ; count <= size * size ; count++)
53 {
54 row = (i - 1 < 0)?(size - 1):(i - 1);
55 column = (j - 1 < 0)?(size - 1):(j - 1);
56
57 if(square[row][column])
58 {
59 i = (++i)%size;
60 }
61 else
62 {
63 i = row ;
64 j = (j - 1 < 0)?(size - 1): --j;
65 }
66 square[i][j] = count ;
67 }
68
69 printf("\n大小为%d的魔术矩阵为:\n" , size);
70
71 for(i = 0 ; i < size ; i++)
72 {
73 for(j = 0 ; j < size ; j++)
74 {
75 printf("%d\t" , square[i][j]);
76 }
77 printf("\n");
78 }
79 }
80 }
81 return ;
82 }