奇数魔方阵(经典算法)

说明

将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:
在这里插入图片描述

解法

一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份。

  1. 第一个数字放在第一行第一列的正中央。
  2. 在计算向右(左)上或向下时,我们可以将索引值除以N值,如果得到余数为1就向下,否则就往右(左)上。
  3. 若上一个数在第一行,则下一个数放在行数为N,列数为j+1的位置。
  4. 若上一个数在第N列,则下一个数放在行数为i-1,列数为1的位置。
    (i指行数,j指列数)
    如下图所示:
    在这里插入图片描述
#include <stdio.h> 
#include <stdlib.h> 
#define N 5 

int main(void) { 
    int i, j, key; 
    int square[N+1][N+1] = {0}; 
    i = 0; 
    j = (N+1) / 2; 

    for(key = 1; key <= N*N; key++) { 
        if((key % N) == 1) //向下填入
            i++; 
        else { //右上填入
            i--; 
            j++; 
        } 
		//当数在第0行时
        if(i == 0) 
            i = N; 
        if(j > N) //当数在最后一行N时
            j = 1; 

        square[i][j] = key; 
    } 

    for(i = 1; i <= N; i++) { 
        for(j = 1; j <= N; j++) 
            printf("%2d ", square[i][j]); 
    } 

    return 0; 
} 
发布了3 篇原创文章 · 获赞 0 · 访问量 141

猜你喜欢

转载自blog.csdn.net/weixin_43188432/article/details/104183010