返回列表 上一主題 發帖

[發問] 在方陣或矩陣中,以旋轉方式填入值

本帖最後由 bobomi 於 2015-10-25 22:27 編輯

Sub q77()

  Cells.Clear
   
'**** 上、下、左、右  copy from  ML089 ****
  右 = [{0, 1, "→","┌"}]: 下 = [{1,0,"↓","┐"}]: 左 = [{0,-1,"←","┘"}]: 上 = [{-1, 0,"↑","└"}]
  
  yx = Array(右, 下, 左, 上)

  r = 10
  c = 10
  Value = 1
  Cells(r, c) = Value
  For Count = 1 To  6^2
  rc = yx(方向 Mod 4)
  n = CLng(Count / 2 + 0.001)
  For Repeat = 1 To n
      r = r + rc(1)
      c = c + rc(2)
      Value = Value + 1
      If Repeat = n Then
         Cells(r, c) = yx((方向 + 1) Mod 4)(4) & " " & Value
      Else
         Cells(r, c) = rc(3) & " " & Value
      End If
  Next
  方向 = 方向 + 1
  Next


' 最後 ◎ ● 這2符號請自己處理

End Sub
2

評分人數

    • 准提部林: 精品文章,也是值得參考好式金錢 + 5
    • ML089: 精品文章,第一個達陣的。金錢 + 5

TOP

回復 7# no3-taco


∼∼只是剛剛練習寫〔正好〕有寫出來∼∼ 

那就更不簡單,我是腦神經快轉不過來了!
這題本以為不會有人關注,沒想到還是得到兩個不同解法,真是感激您們的關注!
繼續期待其它解法!!

需求結果2也可再想想∼∼

TOP

回復 6# 准提部林

p = p + 1 '修改時忘記拿掉

我不是老手,只是剛剛練習寫正好有寫出來

TOP

回復 5# no3-taco


這是我完全不可能去想的方式, 真是 老手 + 高手,
測試完全符合,
謝謝您的參與及提供知識結晶~~

TOP

本帖最後由 no3-taco 於 2015-10-25 19:34 編輯

沒有寫得很精實,但是結果是一樣的
ps:需先點選一個足夠填滿的儲存格
  1. Sub testarr()  '從這裡執行
  2. arrX 7, 1  '7階 ,數列初始值
  3. End Sub

  4. Sub arrX(numX&, k&)
  5. Dim cx&, cy&
  6. arr = Array(0, 1, 0, -1, 0, 1)
  7. If numX <> 1 Then
  8. arrX numX - 2, k
  9.     p = (numX - 1) / 2
  10.     For i = 1 To 4
  11.         For j = 0 To numX - 2
  12.             k = k + 1
  13.             cx = ActiveCell.Row + p * arr(i - 1) + arr(i) * j - arr(i) * (p - 1)
  14.             cy = ActiveCell.Column + p * arr(i) + arr(i + 1) * j - arr(i + 1) * (p - 1)
  15.             Cells(cx, cy) = k
  16.         Next j
  17.     Next i
  18.     p = p + 1
  19. Else
  20.     ActiveCell = k
  21. End If
  22. End Sub
複製代碼
2

評分人數

TOP

回復 3# 准提部林

知識+的W大用數學及函數的功力真是無人能敵,原先一開始我也是朝這方向構想。

後來看你貼的效果圖在哪裡轉啊轉啊,突然想到既然要用VBA就有全新的構想。
從貼圖的運動模式可以整理如下
1. 每一步只有 上、下、左、右 等4種步法
2. 要圍繞中心排列,所以每一步都要選擇離中心最近的距離。

'控制方向及轉向  
yx = Application.Transpose(Application.Transpose(Array(右, 下, 左, 上))) '第一步向右,順時排列
圖片 1.jpg
利用上式中 ... 右, 下, 左, 上 的放置順序來控制方向及轉向
第1位置控制第一步方向,可以放置 ..... 右, 下, 左, 上 .... 來改變。
第2~3位置控制順、逆排列方向。

yx = Application.Transpose(Application.Transpose(Array(下, 右, 上, 左)))  '第一步向下,逆時排列
圖片 2.jpg

只能寫些簡單VBA,介面及語法有不足的地方歡迎大家繼續修改。
1

評分人數

{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 2# ML089


就是佩服板主的數學功力!
這題是之前知識+解過的問題,覺得數學太複雜,根本想不出這個方法,只能純粹以Range方法去跑∼∼
謝謝板主的給力∼∼

TOP

  1. Option Base 1
  2. Sub 以旋轉方式填入值()

  3.     xc = 10: yc = 10 '中心位置

  4.     右 = [{0, 1}]: 下 = [{1,0}]: 左 = [{0,-1}]: 上 = [{-1, 0}]
  5.     yx = Application.Transpose(Application.Transpose(Array(右, 下, 左, 上))) '控制方向及轉向
  6.    
  7.     n = InputBox("輸入排列數字", , 25)
  8.     n1 = Application.RoundUp(((n ^ 0.5) - 1) / 2, 0) + 1
  9.     nn = n1 * 2 + 1
  10.     Cells(yc - n1, xc - n1).Resize(nn, nn).ClearContents

  11.     x = xc: y = yc
  12.     Cells(xc, yc) = 1
  13.     For i = 2 To n
  14.         ds = [{0,0,0,0}]
  15.         For j = 1 To 4 '四個方向
  16.             If Cells(y + yx(j, 1), x + yx(j, 2)) = "" Then
  17.                 ds(j) = ((y + yx(j, 1) - yc) ^ 2 + (x + yx(j, 2) - xc) ^ 2) * 10 + j '距離*10+方向
  18.             Else
  19.                 ds(j) = ""
  20.             End If
  21.         Next
  22.         jj = Application.Min(ds) Mod 10 '取距離原點最短及排列最前方向
  23.         x = x + yx(jj, 2)
  24.         y = y + yx(jj, 1)
  25.         Cells(y, x) = i
  26.     Next
  27. End Sub
複製代碼
1

評分人數

{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

        靜思自在 : 君子為目標,小人為目的。
返回列表 上一主題