Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2194|回复: 9

[已解决]按规律填充n的平方个数字

[复制链接]
发表于 2013-1-15 12:50 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2013-1-15 12:59 编辑


1.rar (7.05 KB, 下载次数: 7)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-1-15 13:13 | 显示全部楼层
这题好深啊,从规律上看,需要用到递归,难,太难了
回复

使用道具 举报

发表于 2013-1-15 14:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 aof110 于 2013-1-15 14:31 编辑

换了种思路

用一直向左转的方法

Sub aa()
  Dim arr() As Integer
  Dim i%, n%, x%, y%, x2%, y2%
  On Error Resume Next
  n = 6
  x = 1: y = 1 '初始位置
  x2 = 1: y2 = 0 '控制方向
  
  ReDim arr(1 To n, 1 To n)
  For i = 1 To n * n
    arr(x, y) = i
    If arr(x + x2, y + y2) <> 0 Then
   
      If x2 = 1 And y2 = 0 Then
        x2 = 0: y2 = 1
      ElseIf x2 = 0 And y2 = 1 Then
        x2 = -1: y2 = 0
      ElseIf x2 = -1 And y2 = 0 Then
        x2 = 0: y2 = -1
      ElseIf x2 = 0 And y2 = -1 Then
        x2 = 1: y2 = 0
      End If
   
    End If
   
    x = x + x2
    y = y + y2
   
  Next i
  Range("a1").Resize(n, n) = ""
  Range("a1").Resize(n, n) = arr
End Sub

评分

参与人数 1 +1 收起 理由
笨笨四 + 1 虽不明,但觉厉啊。。不能给金币?

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-1-15 14:25 | 显示全部楼层
aof110 发表于 2013-1-15 14:07
换了种思路

用一直向左转的方法

谢谢aof110!

厉害呀!
可否讲解下for next里的这么写的原因吗?我还没明白为什么这么做。



回复

使用道具 举报

发表于 2013-1-15 14:30 | 显示全部楼层
N *N 个数,如N=6,一共36个数,一直按一个方向前进,遇到边或是前一格已经有数据,就向左转,直到36个数填写完毕

评分

参与人数 2 +1 金币 +20 收起 理由
笨笨四 + 1 很给力!
爱疯 + 20 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-1-15 14:48 | 显示全部楼层
aof110 发表于 2013-1-15 14:30
N *N 个数,如N=6,一共36个数,一直按一个方向前进,遇到边或是前一格已经有数据,就向左转,直到36个数填 ...



奇怪,为什么在你的代码里不报“下标越界”,而在我的测试代码(如下的过程a)里报错呢?
Sub a()
    Dim arr, n
    n = 6
    ReDim arr(1 To n, 1 To n)
    MsgBox arr(7, 1) <> 0
End Sub


回复

使用道具 举报

 楼主| 发表于 2013-1-15 14:54 | 显示全部楼层
哦,就是想起了,前面有    On Error Resume Next

{:031:}
回复

使用道具 举报

 楼主| 发表于 2013-1-15 15:18 | 显示全部楼层
aof110 发表于 2013-1-15 14:30
N *N 个数,如N=6,一共36个数,一直按一个方向前进,遇到边或是前一格已经有数据,就向左转,直到36个数填 ...

如果不用on error,会很麻烦么?

想晕了。。。。。。
回复

使用道具 举报

发表于 2013-1-15 15:37 | 显示全部楼层
不用on error 也可以,需要把数组声明的大点
如N=6,就需要声明 arr(1 to 8,1 to 8) 的数组,让数组最外一圈留下位置做判断,防止下标出界

评分

参与人数 1 +1 收起 理由
笨笨四 + 1 怎么送金币?权限不够么?好歹我也是中班了.

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-1-15 15:45 | 显示全部楼层
aof110 发表于 2013-1-15 15:37
不用on error 也可以,需要把数组声明的大点
如N=6,就需要声明 arr(1 to 8,1 to 8) 的数组,让数组最外一 ...

谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-23 17:54 , Processed in 0.344520 second(s), 19 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表