// MagicMatrix.cpp : Defines the entry point for the console application. //此程序只适合矩阵为奇数时 #include "stdafx.h" #include <iostream> using namespace std; #define Matrixlen 5 static int magicmatrix[Matrixlen][Matrixlen]; void PrintMagic(int N) { int i, j, k; //初始化矩阵,全部赋为0,可以同时作为标志位 for(i = 0; i < N; i++) for(j = 0; j < N; j++) magicmatrix[i][j] = 0; magicmatrix[0][N/2] = 1; i = 0; j = N / 2; for(k = 2; k <= N * N; k++) { i = i - 1; j = j + 1; if ((i < 0) && (j >= N)) { i = i + 2; j = j - 1; } else { if(i < 0) i = N - 1; if (j >= N) j = 0; } if(magicmatrix[i][j] == 0) magicmatrix[i][j] = k; else { i = i + 2; j = j - 1; magicmatrix[i][j] = k; } } } int _tmain(int argc, _TCHAR* argv[]) { PrintMagic(Matrixlen); for(int i = 0; i < Matrixlen; i++) { for(int j = 0; j < Matrixlen; j++) cout << magicmatrix[i][j] << " "; cout << endl; } return 0; }
算法设计:
⑴ N 为奇数时,最简单
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
