找回密码
 加入
搜索
楼主: pusofalse

[效率算法] AU3编程 输出螺旋方阵

 火... [复制链接]
发表于 2011-1-17 21:21:50 | 显示全部楼层
高难度的东西
发表于 2011-1-17 21:39:41 | 显示全部楼层
学习一下~~~~
发表于 2011-1-17 23:34:54 | 显示全部楼层
贴出来的那段是完整的吗
 楼主| 发表于 2011-1-17 23:39:02 | 显示全部楼层
十分感谢所有人的参与,这是我的解,与ceoguang兄思路相似。

自内向外:

#include <Array.au3>

Const Enum $RIGHT = 1, $DOWN, $LEFT, $UP, $INVALID_DIRECT

Local $iUBound, $fFlag = TRUE, $iTimer
Local $iX, $iY, $iDirect = $RIGHT, $iStepsRequest = 1, $iStepped

$iUBound = Int(Execute(InputBox("", "Input the number of Spiral bands.")))
If $iUBound < 1 Then Exit

$iTimer = TimerInit()

$iX = BitShift($iUBound, 1) + BitAnd($iUBound, 1) - 1
$iY = $iX

Local $aMatrix[$iUBound][$iUBound]

For $i = 1 To $iUBound ^ 2
        $aMatrix[$iX][$iY] = $i

        $iStepped += 1

        Switch $iDirect
        Case $RIGHT
                $iY += 1
        Case $DOWN
                $iX += 1
        Case $LEFT
                $iY -= 1
        Case $UP
                $iX -= 1
        EndSwitch

        If ($iStepped = $iStepsRequest) Then
                $iDirect += 1
                If $iDirect = $INVALID_DIRECT Then $iDirect = $RIGHT

                $iStepped = 0
                $fFlag = Not $fFlag

                If $fFlag Then $iStepsRequest += 1
        EndIf
Next

_ArrayDisplay($aMatrix, TimerDiff($iTimer))


自外向内:

#include <Array.au3>

Local $iUBound, $iFlags = TRUE, $iTimer
Local $iX, $iY, $iDirect = 1, $iStepsRequest = 1, $iStepped

$iUBound = Int(Execute(InputBox("", "Input the number of Spiral bands.")))
If $iUBound < 1 Then Exit

$iTimer = TimerInit()

$iX = BitShift($iUBound, 1)
$iY = $iX -  BitAnd(BitNot(BitAnd($iUBound, 1)), 1)

If BitAnd($iUBound, 1) Then
        Const Enum $LEFT = 1, $DOWN, $RIGHT, $UP, $INVALID_DIRECT
Else
        Const Enum $RIGHT = 1, $UP, $LEFT, $DOWN, $INVALID_DIRECT
EndIf

Local $aMatrix[$iUBound][$iUBound]

For $i = $iUBound ^ 2  To 1 Step - 1
        $aMatrix[$iX][$iY] = $i

        $iStepped += 1

        Switch $iDirect
        Case $LEFT
                $iY -= 1
        Case $DOWN
                $iX += 1
        Case $RIGHT
                $iY += 1
        Case $UP
                $iX -= 1
        EndSwitch

        If $iStepped = $iStepsRequest Then
                $iDirect += 1
                If $iDirect = $INVALID_DIRECT Then $iDirect = 1

                $iStepped = 0
                $iFlags = Not $iFlags

                If $iFlags Then $iStepsRequest += 1
        EndIf
Next

_ArrayDisplay($aMatrix, TimerDiff($iTimer))

评分

参与人数 1贡献 +3 收起 理由
lixiaolong + 3 学习了

查看全部评分

发表于 2011-1-18 00:49:35 | 显示全部楼层
完全看不懂
发表于 2011-1-18 09:26:07 | 显示全部楼层
关于 Bit 之类(BitAnd) 无法理解他们的输出值的用处~,,呵呵, 拜读~
发表于 2011-1-18 09:58:09 | 显示全部楼层
感谢交流。
发表于 2011-1-19 22:42:53 | 显示全部楼层
回复 34# pusofalse

我试了一下Const Enum 出错.

Global Enum,Local Enum,Dim Enum都可以,版本问题?
 楼主| 发表于 2011-1-19 22:54:46 | 显示全部楼层
回复 38# lixiaolong


    应该是版本问题,我用的是3.3.5.3版本,没提示出错。
仔细想想,Const Enum这种写法的确是错误的,因为 Enum定义的已经是常量了,再加上Const就会重复了。
发表于 2011-1-21 18:54:34 | 显示全部楼层
这个很N啊,佩服
发表于 2011-1-22 11:54:18 | 显示全部楼层
本帖最后由 easied 于 2011-1-22 11:59 编辑

解决了原贴的问题,和这贴子的第一个问题.
这里贴的代码是这贴子的第一个问题解答,不过思维被搞得很混乱,有些东西还没有想明白.请高人赐教!
#include <Array.au3>

Local $Input
$Input = InputBox("趣味算法——螺旋数", "请输入螺旋数的阶数")
$Input = $Input^2

Local $aiTemp[2]                                ;临时结果
Local $iRank = 0                                ;螺旋数的阶数
Do
        $iRank += 1
Until $iRank^2 >= $Input
Local $aiResult[$iRank+1][$iRank+1]        ;保存计算结果,预定义多一行一列

;计算每一个数字的坐标,并在相应的数组位置上保存这个数字
For $i = 1 To $Input Step 1
        $aiTemp = fn_Calc($i)
        $aiResult[$aiTemp[1]+Int($iRank/2)][$aiTemp[0]+Int($iRank/2)] = $i
Next
;清理多出来的一行一列数字
If $aiResult[0][0] = "" Then
        For $i = 0 To $iRank - 1
                For $ii = 0 To $iRank -1
                        $aiResult[$i][$ii] = $aiResult[$i][$ii+1]
                Next
        Next
        ReDim $aiResult[$iRank+1][$iRank]
EndIf
If $aiResult[$iRank][0] = "" Then ReDim $aiResult[$iRank][$iRank+1]
;数组翻转,处理由Y轴带来的问题
;====================================================================================================
; 虽然我把这问题解决了,
; 但是到底具体是什么原因出现了这情况和为什么能用这办法解决,我都没弄清楚,思维被搞得混乱.请高人赐教!!
;====================================================================================================
Local $Y = UBound($aiResult, 1)
Local $iTemp
$i = 0
Do
        For $ii = 0 To UBound($aiResult, 2) -1
                $iTemp                  = $aiResult[$i][$ii]
                $aiResult[$i][$ii]      = $aiResult[$Y-1-$i][$ii]
                $aiResult[$Y-1-$i][$ii] = $iTemp
        Next
        $i += 1
Until $i >= $Y/2
_ArrayDisplay($aiResult, $aiTemp[0] &","& $aiTemp[1])
Exit


Func fn_Calc($Input)
        ;返回:螺旋数相对数字1的坐标
        ;假设:螺旋数从数字1开始,数字1的坐标是(0,0)
        ;假设:螺旋数第一步为向正右方,由内向外顺时针旋转
        
        Local $aiResult[2]                ;计算结果
        Local $iRank = 0                ;螺旋数的阶数
        Local $iWay                                ;控制方向
        ;计算输入的数值在螺旋数内的阶数
        Do
                $iRank += 1
        Until $iRank^2 >= $Input
        ;计算螺旋数所在阶数范围内最大数值的坐标
        If $iRank/2 <> Int($iRank/2) Then
                $iWay = -1                ;奇数时,计算式方向为负
                $aiResult[0] = ($iRank-1)/2
                $aiResult[1] = ($iRank-1)/2
        Else
                $iWay = 1                ;偶数时,计算式方向为正
                $aiResult[0] = -1 * ($iRank/2 - 1)
                $aiResult[1] = -1 * ($iRank/2)
        EndIf
        ;计算输入的数值在螺旋数内的坐标
        $iDValue = $iRank^2 - $Input
        If $iDValue <= ($iRank^2 - ($iRank - 1)^2)/2 Then
                $aiResult[0] += $iWay * $iDValue
        Else
                $aiResult[0] += $iWay * $iRank - $iWay
                $aiResult[1] += $iWay * ($iDValue - $iRank) + $iWay
        EndIf
        Return($aiResult)
EndFunc

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 学习了。

查看全部评分

发表于 2011-1-22 12:44:23 | 显示全部楼层
意义何在   能干什么。。
发表于 2011-1-22 16:11:46 | 显示全部楼层
研究研究。。。
 楼主| 发表于 2011-1-22 18:04:43 | 显示全部楼层
回复 42# qop1830

回复 21# nxbigdaddy


    毫无意义,为了发散思维,打发时间而已。
发表于 2011-1-23 11:28:26 | 显示全部楼层
我猜想是从外圈开始获取每个数字的坐标,然后按坐标排序。。。也许吧  囧
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 20:52 , Processed in 0.087114 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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