Haskell 学习笔记-11:蛇形填数算法

本文介绍了一种使用Haskell语言实现的算法,该算法能在n×n矩阵中按蛇形路径填充连续自然数。通过递归方式逐步构建矩阵,演示了从1×1到7×7矩阵的填充过程。

练习:在 n×nn×n 矩阵填充连续自然数,例如:

11211102131693141584567(12341213145111615610987)

今天我打算抱一颗平常心,不追求代码行最少,按照 C 语言的习惯,慢条斯理写出这个算法。放下心理包袱,感觉好极了。

snakeRect n = 
    snakeRect_ n 0
    where   
        snakeRect_ 0 k = []
        snakeRect_ 1 k = [[k+1]]
        snakeRect_ n k = 
            [[k+1..k+n]] ++ mid ++ [reverse [k+2*n-1.. k+3*n-2]]
            where
                leftSize    = [[x]|x<-[k+4*n-4,k+4*n-5.. k+3*n-1]]
                rightSide   = [[x]|x<-[k+n+1..k+2*n-2]]
                mid_        = zipWith (++) (snakeRect_ (n-2) (k+n*4-4)) rightSide
                mid         = zipWith (++) leftSize mid_        

//run it ...

>> snakeRect 0
[]

>> snakeRect 1
[[1]]

>> snakeRect 2
[   
[1,2],
[4,3]]

>> snakeRect 3
[
[1,2,3],
[8,9,4],
[7,6,5]]

>> snakeRect 4
[
[1, 2, 3, 4],
[12,13,14,5],
[11,16,15,6],
[10,9, 8, 7]]

>> snakeRect 5
[
[ 1, 2, 3, 4, 5],
[16,17,18,19, 6],
[15,24,25,20, 7],
[14,23,22,21, 8],
[13,12,11,10, 9]]

>> snakeRect 6
[
[ 1, 2, 3, 4, 5, 6],
[20,21,22,23,24, 7],
[19,32,33,34,25, 8],
[18,31,36,35,26, 9],
[17,30,29,28,27,10],
[16,15,14,13,12,11]]

>> snakeRect 7
[
[ 1, 2, 3, 4, 5, 6, 7],
[24,25,26,27,28,29, 8],
[23,40,41,42,43,30, 9],
[22,39,48,49,44,31,10],
[21,38,47,46,45,32,11],
[20,37,36,35,34,33,12],
[19,18,17,16,15,14,13]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值