把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同,即为n阶魔方阵。
根据魔方阵的规律,我将它分为三种情况。
规律:第一个数放在第一行的中间,下一个数放在上一个数的上一行下一列,若该位置已经有了数字即放在上个数的下面一行的相同列
用c语言编程如下:
示例:n=5;
#include<stdio.h>#include<stdlib.h>#include<asrt.h> void magic1(){#define row 5#define col rowasrt(row % 2 != 0); //判断n是否为奇数 int arr[row][col] = { 0 }; //定义二维数组 int currow = 0;int curcol = col / 2;arr[currow][curcol] = 1;for (int i = 2; i <= row * col; i++) {if (arr[(currow - 1 + row) % row][(curcol + 1) % col] == 0) //按照规律赋值{currow = (currow - 1 + row) % row;curcol = (curcol + 1) % col;}el {currow = (currow + 1) % row;}arr[currow][curcol] = i;} for (int i = 0; i < row; i++) //打印魔方阵{for (int j = 0; j < col; j++){printf("%-3d", arr[i][j]);}printf("\n");} }int main(){ magic1();return 0;}
结果:
规律:按数字从小到大,即1,2,3……n顺序对魔方阵从左到右,从上到下进行填充;
将魔方阵分成若干个4×4子方阵(如:8阶魔方阵可分成四个4×4子方阵),将子方阵对角线上的元素取出;将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。
#include<stdio.h>#include<stdlib.h>#include<asrt.h>//偶数魔方阵 4k void magic2(){#define row 8#define col rowint tmp = 1;int arr[row][col] = { 0 }; //定义二维矩阵for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++){arr[i][j] = tmp++;}}int row1 = 重庆人文科技学院教务系统1;int tei618skcol1 = 1; int row2 = 1;int col2 = 1; for (int i = 0; i < (row / 4) ; i++){for (int j = 0; j < (col / 4); j++){row1 = 4 * i;col1 = 4 * j;row2 = 4 * i;col2 = 4 * j + 3;for (int k = 0; k < 4; k++){arr[row1][col1] = (row * col + 1) - arr[row1][col1];arr[row2][col2] = (row * col + 1) - arr[row2][col2];row1++;col1++;row2++;col2--;}}} for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf("%-3d", arr[i][j]);}printf("\n");} }int main(){magic2();return 0;}
结果:
规律:
3.1.填充规则
将魔方分成a、b、c、d四个k阶奇方阵, 利用奇数魔方阵填充方法依次将a、d、b、c填充 。
3.2.交换规则 上下标记的数字进行交换
1.右半边大于k+2的列(从1开始)
2.左半边,上下两个块最中心的点进行交换
3.左半边小于中心列的列(除了上下半边最中心的行的第一列的那个值不用交换)(从1开始)
#include<stdio.h>#include<asrt.h>#include<stdlib.h> void magic3(){#define row 10 #define col rowasrt(row % 2 == 0 && row % 4 != 0);int arr[row][col] = { 0 };//左上角int currow = 0;int curcol = row/4;arr[currow][curcol] = 1;int tmp = 0;for (int i = 2; i <= row * col/ 4; i++){if (arr[(currow - 1 + row / 2) % (row / 2)][(curcol + 1) % (col / 2)] == 0) //判断上一行下一列是否被赋值{currow = (currow - 1 + row / 2) % (row / 2);curcol = (curcol + 1) % (col / 2);}el{currow = (currow + 1) % (row / 2); }arr[currow][curcol] = i;} //右下角currow = row / 2;for (int i = 0; i < row / 2; i++, currow++){curcol = col / 2;for (int j = 0; j < col / 2; j++, curcol++){arr[currow][curcol] = arr[i][j] + 9;}}//右上角currow = 0;for (int i = row/2; i < row ; i++, currow++){curcol = col / 2;for (int j = col/2; j < col; j++, curcol++){arr[currow][curcol] = arr[i][j] + 9;}}//左下角currow = row / 2;for (int i = 0; i < row/2; i++, currow++){curcol = 0;for (int j = col/2; j < col; j++, curcol++){arr[currow][curcol] = arr[i][j] + 9;}} //替换规则1:右半边 大于k+2的列 进行上下交换for (int i = 0; i < row / 2; i++){for (int j = row / 2 + row / 4 + 2; j < col; j++){tmp = arr[i][j];arr[i][j] = arr[i + row / 2][j];arr[i + row 翻越那座山/ 2][j] = tmp;}}//替换规则2:交换左半边,两个中心节点currow = row / 4;curcol = col / 4;tmp = arr[currow][curcol];arr[currow][curcol] = arr[currow + row / 2][curcol];arr[currow + row / 2][curcol] = tmp; //替换规则3:左半边,除(k+1,1)这个点外,小于k+1的列 上下交换for (int j = 0; j < row / 4; j++) //枫泾古镇旅游攻略表示交换的列{for (int i = 0; i < row / 2; i++) //表示交换的行{if (i == row / 4 && j == 0){continue;}el{tmp = arr[i][j];arr[i][j] = arr[i + row / 2][j];arr[i + row / 2][j] = tmp;}}}//打印for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf("%-3d", arr[i][j]);}printf("\n");}} int main(){magic3();return 0;}
结果:
到此这篇关于c语言魔方阵的三种实现方法的文章就介绍到这了,更多相关c语言魔方阵内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家会计学类以后多多支持www.887551.com!
本文发布于:2023-04-04 01:17:53,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1f59a6e0ef94ebb3f995eadf28ba4aa3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C语言魔方阵的三种实现方法.doc
本文 PDF 下载地址:C语言魔方阵的三种实现方法.pdf
留言与评论(共有 0 条评论) |