绿色风
发表于 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
我猜想是从外圈开始获取每个数字的坐标,然后按坐标排序。。。也许吧囧