这篇文章再和大家分享一些有“背景”的程序设计,希望能够让大家学到知识的同时,对编程学习更感兴趣,更能在这条路上坚定地走下去。
目录
1.幻方问题
幻方又称魔方阵,游戏规则是在一一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如下图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。
解决幻方问题的方法很多,下面介绍一种“左上斜行法”的填数方法,该方法适用于任意奇数阶幻方,具体填数过程如下:
(1)由1开始填数,将1放在第1行的中间位置;
(2)将幻方想象成上下、左右相接,每次往左上角走一一步,会有下列情况:
①左上角超出上边界,则在最下边对应的位置填入下一个数,如图A所示;
②左上角超出左边界,则在最右边对应的位置填入下一个数,如图 B所示;
③按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数,如图 C所示:
算法实现如下:
设数组a[n][n]表示幻方,当前填数的位置为(i,j),则其左上方的位置是(i-1,j-1),将被填的数作为循环变量。
1.初始化填数的位置,i=0,j=n/2;
2.在位置(i,j)填入1;
3.数字k从2~n*n重复执行下述操作:
3.1从位置(i,j)往左上角走到位置(i-1,j-1);
3.2如果i超出上边界,则i=n-1;
3.3如果j超出左边界,则j=n-1;
3.4如果位置(i,j)已经填数,则在原位置的同一列下一行填入k;否则,在位置(i,j)填入k
3.5k++;
代码实现如下:
#include<stdio.h>
int main()
{
int arr[100][100]={0},num,i,j,k;//num是咱预处理的幻方阶数
int tempi,