打印魔方矩阵

    技术2026-06-15  12

    // 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列时,

      则把下一个数放在上一个数的下面。

    最新回复(0)