从键盘上任意输入一个1-10之间的整数N,就产生一个NXN阶的方阵,并且此方阵是一个螺旋方阵。采用易语言循环算法来实现。
求一个螺旋方阵,其实就是分别往下、往右、往上、往左四个方向来依次填充数字,那么就是想办法判定什么时候向什么方向填充数字。
本算法采用四个子程序来分别控制往下、往右、往上、往左四个方向的填充,设四个变量,用于标识四个方向每次填充的起始位置,每填充一个方向后起始位置加1。
再用一个二维数组存放要填充的数字先将这个数组数据全部置为0,在每个方向填充时,每填充一个数字,就将这个数字存放到数组中相应的位置,通过判断要填充的位置所对应的数组数据是否为0,来确定是否终止该方向的数字填充。
通过上面规律可以推导出结果。
程序集变量
.版本 2 .程序集 启动窗口程序集 .程序集变量 数字数组, 整数型, , "10,10", 存放方阵中的所有数字 .程序集变量 循环变量, 整数型 .程序集变量 下起始, 整数型, , , 向下填充的起始位置 .程序集变量 右起始, 整数型, , , 向右填充的起始位置 .程序集变量 上起始, 整数型, , , 向上填充的起始位置 .程序集变量 左起始, 整数型, , , 向左填充的起始位置 .程序集变量 填充数字, 整数型, , , 被填充的数字 .程序集变量 最大值, 整数型, , , 方阵中的最大数字 .程序集变量 阶数, 整数型, , , 方阵的阶数
向下填充
.版本 2 .子程序 向下填充, , , 向下填充方阵中的数字 ' 向下填充 .变量循环首 (1, 阶数, 1, 循环变量) ' 向方阵中填充数字 .如果真 (数字数组 [循环变量] [下起始] = 0) 数字数组 [循环变量] [下起始] = 填充数字 ' 下一个要填充的数字 填充数字 = 填充数字 + 1 .如果真结束 .变量循环尾 () ' 向下填充的下一个起始位置 下起始 = 下起始 + 1
向右填充
.版本 2 .子程序 向右填充, , , 向右填充方阵中的数字 ' 向右填充 .变量循环首 (1, 阶数, 1, 循环变量) .如果真 (数字数组 [右起始] [循环变量] = 0) ' 向方阵中填充数字 数字数组 [右起始] [循环变量] = 填充数字 ' 下一个要填充的数字 填充数字 = 填充数字 + 1 .如果真结束 .变量循环尾 () ' 向右填充的下一个起始位置 右起始 = 右起始 - 1
向上填充
.版本 2 .子程序 向上填充, , , 向上填充方阵中的数字 ' 向上填充 .变量循环首 (阶数, 1, -1, 循环变量) .如果真 (数字数组 [循环变量] [上起始] = 0) ' 向方阵中填充数字 数字数组 [循环变量] [上起始] = 填充数字 ' 下一个要填充的数字 填充数字 = 填充数字 + 1 .如果真结束 .变量循环尾 () ' 向上填充的下一个起始位置 上起始 = 上起始 - 1
向左填充
.版本 2 .子程序 向左填充, , , 向左填充方阵中的数字 ' 向左填充 .变量循环首 (阶数, 1, -1, 循环变量) .如果真 (数字数组 [左起始] [循环变量] = 0) ' 向方阵中填充数字 数字数组 [左起始] [循环变量] = 填充数字 ' 下一个要填充的数字 填充数字 = 填充数字 + 1 .如果真结束 .变量循环尾 () ' 向左填充的下一个起始位置 左起始 = 左起始 + 1
开始计算
.版本 2 .支持库 iext .子程序 _计算图形按钮_被单击 超级列表框1.全部删除 () ' 接收方阵的阶数 阶数 = 到数值 (编辑框1.内容) ' 判断阶数的范围 .如果真 (阶数 < 1 或 阶数 > 10) 信息框 (“输入的值只能在1-10之间!”, 0, ) 返回 () .如果真结束 ' 初始化数字数组,初始为0 .变量循环首 (1, 阶数, 1, 下起始) .变量循环首 (1, 阶数, 1, 右起始) 数字数组 [下起始] [右起始] = 0 .变量循环尾 () .变量循环尾 () ' 设定要填充的第一个数字为1 填充数字 = 1 ' 设定四个方向填充时的初始位置值 下起始 = 1 左起始 = 1 右起始 = 阶数 上起始 = 阶数 ' 方阵中的最大数字 最大值 = 阶数 × 阶数 ' 开始填充 .判断循环首 (填充数字 ≤ 最大值) 向下填充 () 向右填充 () 向上填充 () 向左填充 () .判断循环尾 () ' 显示结果方阵 .变量循环首 (1, 阶数, 1, 下起始) 超级列表框1.插入表项 (下起始, , , , , ) .变量循环首 (1, 阶数, 1, 右起始) 超级列表框1.置标题 (下起始 - 1, 右起始 - 1, 到文本 (数字数组 [下起始] [右起始])) .变量循环尾 () .变量循环尾 ()