问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【数据结构】寻找规律:算对角线长度||杨辉三角||魔方问题(C语言实现)

创作时间:
作者:
@小白创作中心

【数据结构】寻找规律:算对角线长度||杨辉三角||魔方问题(C语言实现)

引用
CSDN
1.
https://blog.csdn.net/zjoy_/article/details/145541156

本文将介绍三个经典的算法问题:求矩阵对角线元素之和、杨辉三角的构造以及幻方问题的解决方法。这些问题都通过寻找规律来找出构造逻辑,并用循环来实现。

三个算法

1. 求矩阵对角线元素之和(C语言)

  1. 初始化行循环变量i和列循环遍历j,求和变量sum,初始化全部的元素为0
  2. 用书输入9个数
  3. 执行换行之后
    关键点:
  4. 对角线的元素的【i】和【j】是相等的[左上到右下]
  5. 右上到坐下的坐标,相加为2,那么i+j=2——>i=2-j
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    // 初始化变量值;
    int i = 0;
    int j = 0;
    int sum = 0;
    int a[3][3] = { 0 };

    // 获取数组a的值;
    printf("请输入9个整数!!!!\n");
    // 循环;
    for (i = 0; i < 3; i++)
    {
        // 列;
        for (j = 0; j < 3; j++)
        {
            // 提示用户;
            printf("a[%d][%d]=", i, j);
            // 获取用户输入的数据;
            scanf("%d", &a[i][j]);
        }
    }

    // 换行;
    printf("\n");

    // 提示用户;
    printf("您输入的矩阵为:\n");
    // 打印数组;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            // 打印;
            printf("%5d", a[i][j]);
        }

        // 换行;
        printf("\n");
    }

    // 换行;
    printf("\n");

    // 运算;
    for (i = 0; i < 3; i++)
    {
        // 运算;
        sum += a[i][i];
        sum += a[i][2-i];
    }

    // 输出结果;
    printf("对角线之和为:%d", sum);

    return 0;
}

2. 杨辉三角

问题描述:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

用算法构造出来这样的三角形

规律:

  1. 第一列全为1,最后一列全为1
  1. a[i][0]=1
  2. for循环把最后一列变成1:a[i][i]=1
  1. 其他元素遵循,这一行的数是上一行两数和:a[i][j]=a[i-1][j-1]+a[i-1][j]
#include <stdio.h>
void main(){
    int a[10][10],i,j;
    // 第1列元素值为1
    for(i=0;i<10;i++)
    a[i][0]=1;
    // 对角线元素值为1
    for(i=0;i<10;i++)
    a[i][i]=1;
    // 其它元素
    for(i=2;i<10;i++)
    for(j=1;j<i;j++)
    a[i][j]=a[i-1][j-1]+a[i-1][j];
    // 输出杨辉三角
    for(i=0;i<10;i++)
    {
        for(j=0;j<=i;j++)
        printf("%8d",a[i][j]);
        printf("\n");
    }
}

3. 幻方问题

问题描述:幻方又称魔方阵,游戏规则是在一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。

规律:

  1. 1放在第一行中间开始填数,2在左边一行,2的下一个数字,在右边
  2. 左上角超出上边界,则在最下边对应的位置填入下一个数
  3. 左上角超出左边界,则在最右边对应的位置填入下一个数

int arr[100][100]={0};    // 假设最多为100行、100列
printf("请输入1-100内的奇数:\n");   // 只处理为奇数的方阵
int num;
scanf("%d",&num);
int i,j;
i=0;j=num/2;
arr[i][j]=1;  // 将第一个值存入中间位置
int iTemp,jTemp;  // 用于暂存当前位置
for(int k=2;k<=num*num;k++){
    iTemp=i;
    jTemp=j;
    if(--i<0){  // 判断当前位置是否超出上边界
        i=num-1;
    }
    if(--j<0){  // 判断当前位置是否超出左边界
        j=num-1;
    }
    if(arr[i][j]>0){  // 如果该位置已经有数,则在该位置下面添加数字
        i=iTemp+1;
        if(i==num){
            i=0;
        }
        j=jTemp;;
    }
    arr[i][j]=k;
}
for(int m=0;m<num;m++){
    for(int n=0;n<num;n++){
        printf("%d\t",arr[m][n]);
    }
    printf("\n");
}

总结:都是通过寻找规律来找出构造逻辑然后用循环来实现

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号