绿色风 发表于 2011-1-17 21:21:50

高难度的东西

wua0550 发表于 2011-1-17 21:39:41

学习一下~~~~

微雨湿黄昏 发表于 2011-1-17 23:34:54

贴出来的那段是完整的吗

pusofalse 发表于 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 ^ 2To 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))

kisyan 发表于 2011-1-18 00:49:35

完全看不懂

chenronting 发表于 2011-1-18 09:26:07

关于 Bit 之类(BitAnd) 无法理解他们的输出值的用处~,,呵呵, 拜读~{:face (245):}

dycrystal 发表于 2011-1-18 09:58:09

感谢交流。

lixiaolong 发表于 2011-1-19 22:42:53

回复 34# pusofalse

我试了一下Const Enum 出错.

Global Enum,Local Enum,Dim Enum都可以,版本问题?

pusofalse 发表于 2011-1-19 22:54:46

回复 38# lixiaolong


    应该是版本问题,我用的是3.3.5.3版本,没提示出错。
仔细想想,Const Enum这种写法的确是错误的,因为 Enum定义的已经是常量了,再加上Const就会重复了。

117267948 发表于 2011-1-21 18:54:34

这个很N啊,佩服{:1_582:}

easied 发表于 2011-1-22 11:54:18

本帖最后由 easied 于 2011-1-22 11:59 编辑

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

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

Local $aiTemp                                ;临时结果
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+Int($iRank/2)][$aiTemp+Int($iRank/2)] = $i
Next
;清理多出来的一行一列数字
If $aiResult = "" 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] = "" 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 &","& $aiTemp)
Exit


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

qop1830 发表于 2011-1-22 12:44:23

意义何在   能干什么。。

link369 发表于 2011-1-22 16:11:46

研究研究。。。

pusofalse 发表于 2011-1-22 18:04:43

回复 42# qop1830

回复 21# nxbigdaddy


    毫无意义,为了发散思维,打发时间而已。

蜘蛛抱蛋 发表于 2011-1-23 11:28:26

我猜想是从外圈开始获取每个数字的坐标,然后按坐标排序。。。也许吧囧
页: 1 2 [3] 4
查看完整版本: AU3编程 输出螺旋方阵