数字旋转方阵

学习目标:

  1. 理解分治法的设计思想: 分治法是一种递归算法,它将问题分解成若干个规模较小的相同问题,递归地解决这些子问题,然后再合并这些子问题的解以得到原问题的解。

  2. 掌握数字旋转方阵的实现过程: 数字旋转方阵的填充过程通常从方阵的中心开始,向四周扩散填充数字。如果方阵的阶数是奇数,则中心只有一个数字;如果是偶数,则中心是一个小方阵。填充时,按照顺时针方向,先填充上行,再填充右列,然后填充下行(从右向左),最后填充左列(从下向上)。

  3. 熟练掌握二维数组的使用方法: 二维数组是一种基本的数据结构,用于表示表格或矩阵。在C语言中,二维数组可以通过array[row][column]的方式来访问和修改元素。

  4. 编程实现数字旋转方阵: 编程实现时,可以使用递归函数来填充数字旋转方阵。递归函数应该接收当前填充的数字、起始位置和方阵的阶数作为参数。

简介

   输出一个n∗n的数字方阵,方阵样式如下所示

4 //输入的方阵大小
   1  12  11  10
   2  13  16   9
   3  14  15   8
   4   5   6   7

     数字旋转方阵是一种有趣的数学游戏,也被称为“魔方阵”。它是由数字组成的方阵,其中每个数字都只出现一次,且每一行、每一列以及两条对角线上的数字之和都相等。
数字旋转方阵有多种类型,其中最常见的是3阶、4阶和5阶方阵。例如,一个3阶数字旋转方阵可以由数字1到9组成,每个数字只出现一次,且每一行、每一列以及两条对角线上的数字之和都相等。
        数字旋转方阵的解决方法有多种,其中一种常用的方法是“循环填充法”。具体步骤如下:
1. 选择一个合适的起始点,例如在3阶方阵中选择中间的格子。
2. 从1开始,按照顺时针方向填充数字,直到填满整个方阵。
3. 如果在填充过程中遇到已经填充的格子,则跳过该格子并继续填充下一个格子。
4. 重复步骤2和3,直到填满整个方阵。
数字旋转方阵是一种有趣的数学问题,它可以锻炼人们的逻辑思维能力和空间想象力。此外,数字旋转方阵在计算机科学、密码学等领域也有一定的应用价值。

算法伪代码

函数 FULL(number, begin, size)
    如果 size 等于 0
        打印 "error!"
        结束函数
    如果 size 等于 1
        b[begin][begin] 设为 number
        结束函数

    设 i 为 begin
    设 j 为 begin
    对 k 从 0 到 size - 1
        b[i][j] 设为 number
        number 增加 1
        i 增加 1
    对 k 从 0 到 size - 1
        b[i][j] 设为 number
        number 增加 1
        j 增加 1
    对 k 从 0 到 size - 1
        b[i][j] 设为 number
        number 增加 1
        i 减少 1
    对 k 从 0 到 size - 1
        b[i][j] 设为 number
        number 增加 1
        j 减少 1

    调用 FULL(number, begin + 1, size - 2)

主程序
    设 number 为 1
    设 i, j, begin 为 0
    调用 FULL(number, begin, size)
    对 i 从 0 到 N - 1
        对 j 从 0 到 N - 1
            打印 b[i][j] 的值,右对齐,宽度为 2
        打印换行
    暂停程序
    结束程序

算法代码:

#include<stdio.h>
#define N 5
int size=N,b[N][N];
void FULL(int number,int begin,int size){
    int i,j,k;
    if(size==0) printf("error!");//return ;
    if(size==1){b[begin][begin]=number;b[begin][begin]=number;//return;}
    
    i=begin;
    j=begin;
     for(k=0;k<size-1;k++){
        b[i][j]=number;
        number++;
        i++;
    }
    for(k=0;k<size-1;k++){
        b[i][j]=number;
        number++;
        j++;
    }
    for(k=0;k<size-1;k++){
        b[i][j]=number;
        number++;
        i--;
    }
    for(k=0;k<size-1;k++){
        b[i][j]=number;
        number++;
        j--;
    }
    
    FULL(number,begin+1,size-2);
}

int main(){
    int number=1;
    int i,j,begin=0;
    FULL(number,begin,size);
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%2d ",b[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}


  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值