C语言复习---输出魔方阵

一:奇魔方阵

算法:

1.第一个元素放在第一行中间一列
2.下一个元素存放在当前元素的上一行、下一列。
3.如果上一行、下一列已经有内容,则下一个元素的存放位置为当前列的下一行。
在找上一行、下一行或者下一列的时候,必须把这个矩阵看成是回绕的。

算法实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 100

int main()
{
    //输出魔方阵
    int n,i,j;
    int row, col;
    int lrow, lcol;    //保存上一步数据,用于还原
    int a[MAXSIZE][MAXSIZE] = { 0 };

    while (1)
    {
        printf("print a odd number:(3-99)");
        scanf("%d", &n);
        if (n % 2)
            break;
    }

    row = 0;
    col = (n - 1) / 2;  
    a[row][col] = 1;

    for (i = 2; i <= n*n; i++)
    {
        row--;
        col++;
        if (row < 0)
            row = n - 1;
        if (col >= n)
            col = 0;
        if (a[row][col])    //若是上一行下一列处有数据了,我们就要将下标还原,行数加一
        {
            row = lrow + 1;
            col = lcol;
            if (row >= n)
                row = 0;
        }

        lcol = col;
        lrow = row;
        a[row][col] = i;
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

二:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:

按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充;
将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出;
将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。

算法实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 100

int main()
{
    //输出魔方阵
    int n,i,j;
    int row, col;
    int a[MAXSIZE][MAXSIZE] = { 0 };
    int tempArray[MAXSIZE*MAXSIZE / 2] = { 0 };    //用于存放各个子方阵的主对角线

    while (1)
    {
        printf("print a even number:(4-100)");
        scanf("%d", &n);
        if (n % 4==0)
            break;
    }

    //步骤一:将数据按顺序填充
    i = 1;
    for (row = 0; row < n; row++)
        for (col = 0; col < n; col++)
            a[row][col] = i++;

    //步骤二:将数据全部分为4X4子方阵,取出其中的主对角线,按照大小排序。注意:这里获取的数据已经是从小到大了
    i = 0;
    for (row = 0; row < n; row++)
    {
        for (col = 0; col < n; col++)
        {
            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))
            {
                tempArray[i] = a[row][col];
                i++;
            }
        }
    }

    //步骤三:将数据从大到小放入之前的子方阵对角线上
    i--;
    for (row = 0; row < n; row++)
    {
        for (col = 0; col < n; col++)
        {
            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))
            {
                a[row][col] = tempArray[i];
                i--;
            }
        }
    }

    //步骤四:输出魔方阵
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

三:阶数n = 4 * m + 2(m =1,2,3……)的魔方(单偶魔方)

将魔方分成A、B、C、D四个k阶方阵,这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 6

int main()
{
    //输出魔方阵
    int n, i, j, k,temp;
    int row, col;
    int lrow, lcol;
    int a[MAXSIZE][MAXSIZE] = { 0 };

    while (1)
    {
        printf("print a even number:4*m+2<m=1,2,...>");
        scanf("%d", &n);
        if (n % 4 == 2)
            break;
    }

    //步骤一:构建四个子方阵ADBC
    //先构建A,然后对A进行每个元素加即可得到所有的子方阵
    k = n / 2;
    row = 0;
    col = (k - 1) / 2;
    a[row][col] = 1;
    for (i = 2; i <= k*k;i++)
    {
        row--;
        col++;
        if (row < 0)
            row = k - 1;
        if (col >= k)
            col = 0;
        if (a[row][col])
        {
            row = lrow + 1;
            col = lcol;
            if (row >= k)
                row = 0;
        }

        lcol = col;
        lrow = row;
        a[row][col] = i;
    }

    //按照顺序构建DBC方阵
    for (row = 0; row < k;row++)
    {
        for (col = 0; col < k;col++)
        {
            a[row + k][col + k] = a[row][col] + k*k;    //D子方阵
            a[row][col + k] = a[row][col] + 2*k*k;    //B子方阵
            a[row + k][col] = a[row][col] + 3*k*k;    //C子方阵
        }
    }

    //步骤二:交换AC子方阵的数据
    //1.先交换中间行的右半部分的m列,N=2*(2*m+1),k=2*m+1,m=(k-1)/2,所以这里的m是不包含最后一列的,包含中间列
    //2.对于其他行,将会每行的前半部分
    for (row = 0; row < k;row++)
    {
        if (row == k / 2)    //中间行
        {
            for (col = k / 2; col < k - 1; col++)
            {
                temp = a[row][col];
                a[row][col] = a[row + k][col];
                a[row + k][col] = temp;
            }
        }
        else   //其他行,交换前m列,不包含中间列
        {
            for (col = 0; col < k / 2;col++)
            {
                temp = a[row][col];
                a[row][col] = a[row + k][col];
                a[row + k][col] = temp;
            }
        }
    }

    //步骤三:交换BD子方阵,交换中间列向左m-1列
    for (row = 0; row < k;row++)
    {
        for (i = 0; i < (k - 1) / 2 - 1; i++)
        {
            temp = a[row][k + k / 2 - i];
            a[row][k + k / 2 - i] = a[row + k][k + k / 2 - i];
            a[row + k][k + k / 2 - i] = temp;
        }
    }

    //步骤四:输出魔方阵
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/ssyfj/p/9390469.html

时间: 2024-08-29 03:10:34

C语言复习---输出魔方阵的相关文章

输出n阶“魔方阵”

魔方阵:每一行.每一列和对角线之和均相等. 程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //输出魔方阵 6 int i,j,k,p,n,a[15][15]; 7 p=1;//用于判断输入的数字是否符合条件 8 while(p==1){ 9 printf("enter n (n=1--15):"); 10 scanf("%d",&n); 11 i

魔方阵

①问题描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1-m2的数字(m为奇数),使得每一行.每一列.每条对角线的累加和都相等,如图1所示. 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 图1 五阶魔方阵示例 ②基本要求 输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息. 实现魔方阵. 输出魔方阵. ③实现提示 本实验使用的数据结构是数组. 解魔方阵

java计算奇数阶魔方阵

一.提出问题 所谓"奇数阶魔方阵"是指n为不小于3的奇数的魔方阵.这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵.例如:3阶.5阶和7阶的魔方阵如图3 – 4 所示. , , 图3 – 4 3阶5阶和7阶魔方阵 容易知道,这三个魔方阵的魔方常数分别是15.65和175. 现在要求给出:能让计算机自动输出类似图3 – 4 所示的n阶奇数魔方阵的算法,其中n为任意给定的一个不小于3的奇数. 二.简单分析 决定"奇数阶魔方阵"的关键是要按要求决定其方阵中的

SDUST 作业10 Problem D 魔方阵

Description 所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等.如三阶魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的规律如下: 从1-N*N的 各个数依次如下规则存放: (1) 1在第一行中间一列: (2) 每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列): (3) 如果上一个数在第一行,则下一个数在最后一行,列数加一: (4) 如果上一个数在最后一列,则下一个数在第一列,行数减一: (5)

奇数阶魔方阵

原题 打印魔方阵,魔方阵是指这样的方针,每一行.每一列以及对角线的和相等.例如三阶魔方阵: 8 1 6 3 5 7 4 9 2 编程打印奇数阶魔方阵. 提示 问题解决的关键是元素的填充,第一个元素1的位置在第一行正中,新的位置应该处于最近插入元素的右上方:但如果右上方的位置超出方针上边界,则新的位置应该取列的最下一个位置:超出右边界则取行的最左的一个位置:若最近插入的元素为n的整数倍,则选下面一行同列上的位置为新的位置. 实现代码 /*******************************

生成一个n*n的方阵,然后输出此方阵对角线上元素之和

//输入一个正整数n(1<n<10),根据以下公式生成一个n*n的方阵,然后输出此方阵对角线上元素之和 //公式为a[i][j]=i*n+j+1 (0=<i<n,0=<j<n) 源代码: #include<stdio.h> #include<stdlib.h> #define N 10 //输入一个正整数n(1<n<10),根据以下公式生成一个n*n的方阵,然后输出此方阵对角线上元素之和 //公式为a[i][j]=i*n+j+1 (0

n阶魔方阵

奇数阶魔方阵就是指行列数都是吧n(n>=3 且 n%2 == 1)的魔方阵 奇数阶魔方阵的数字规律 通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律: (1)自然数1出现在第一行的正中间: (2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行)且列数加1(列数右移一列): (3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧: (4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1): (5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前

一起talk C栗子吧(第十八回:C语言实例--输出十六进制)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是栈的例子,这一回咱们说的例子是:输出十六进制. 看官们,我想熟悉C语言的朋友们,对于输出十六进制的内容,肯定都会使用printf函数进行格式化输出. 不过,有时候想输出十六进制时就会有点"不识庐山真面目,只缘身在此山中"的感觉.我在前面的例子中 有一个关于进制转换的例子.当时输出十六进制时使用分别判断10到15,然后依据判

C语言复习(一)关键字

最近在学COCOS2Dx,刚刚开始写一个塔防游戏,因为第一次用VS2012,感觉还不太习惯. C语言的大部分内容也忘记了,因此做一个简要的复习. 1.关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigne