魔方阵

mac2022-06-30  154

题目:

魔方阵是指它的每一行,每一列及对角线之和均相等,所有的数由小到大构成等差序列,注意n要为奇数才符合魔方阵的条件,当n=3时对应的魔方阵为: 8 1 6 3 5 7 4 9 2

思路:

通过观察发现有以下规律: (1)将第一个数放在第一行的中间位置 (2)下一个数应该放在前一个数的右上角 [1]若行越界,则放到最后一行 [2]若列越界,则放到到第一列 [3]若该位置已经存在数,则转到前一个元素的下方

具体实现:

若row代表行,column代表列 右方 column+1 若列越界,则转到第一行(只有当元素在最后一列时会出现列越界)可以改为(column+1)%n 上方 row-1 若行越界(在第一行才会行越界),则放到最后一行可以改为(row-1+n)%n

代码:

#include <stdio.h> #include <stdlib.h> void print(int arr[5][5],int n){ int row, c, row1, c1, i,j; //赋值整个数组初始值为0,方便后面判断是否有数字填入 for ( i = 0; i < n; i++){ for ( j = 0; j < n; j++){ arr[i][j] = 0; } } row = 0; c = n / 2; for (i = 1; i <= n*n; i++){//row=0,c=1,row1=2,c1=2,0==arr[2][2] row=2,c=2// //魔方阵赋值 arr[row][c] = i; //寻找右上方坐标位置 row1 = (row - 1 + n) % n; c1 = (c + 1) % n; //判断位置是否有数 if (0 == arr[row1][c1]){ //还是初始值为0说明未填入数,确定填数坐标 row = row1; c = c1; } else{ //若填过数,转到前一个元素的下方 row = (row + 1) % n; } } //打印出整个数组元素 for (row = 0; row < n; row++){ for (c = 0; c < n; c++){ printf("]", arr[row][c]); } printf("\n"); } } int main(){ //因为vs不能分配常量大小为0的数组因此此处不可以用变量数组,但在此处可以自己更换数字达到变量效果 //注意n为奇数 int n = 0; int arr[5][5]; //调用打印函数 print(arr,5); system("pause"); return 0; }

结果: 结语:如有不足,请多包涵,我会继续改善加油的!

最新回复(0)