2009-02-20 63 views
1

SquareExp2可以是9或16如何簡化這個Sodoku Code?

廣場可以是3或4

的gridbox和gridbox1陣列的長度可以是0至80或0至255

(你現在看到的圖案)

此代碼在程序開始時只運行一次。

For j = 0 To squareExp2 - 1 
    For i = 0 To squareExp2 - 1 
     box = (j * squareExp2) + i 

     gridbox(box) = ((j \ Square) * squareExp2 * Square) + ((j Mod Square) * Square) + (i \ Square) * squareExp2 + (i Mod Square) 
     gridbox1(gridbox(box)) = ((j \ Square) * squareExp2 * Square) + (((j Mod Square) * Square) * Square) 
    Next 
Next 

上面的代碼的目標是將代碼從

k = (gridRow(pos) \ iSquare) * iSquare 
    l = (gridCol(pos) \ iSquare) * iSquare 

    For i = l To l + iSquare - 1 
     For j = k To k + iSquare - 1 
      box = (j * squareExp2) + i 
      foundNumber(grid(box)) = grid(box) 
     Next 
    Next 

移動到

j = myGridbox1(i) 
    For x = j To j + squareExp2 - 1 
     foundNumber(grid(myGridbox(x))) = grid(myGridbox(x)) 
    Next 

*編輯*

到底

  Dim Square2 As Integer = iSquare * iSquare 
      Dim Square3 As Integer = Square2 * iSquare 
      Dim Square4 As Integer = Square2 * Square2 

      Dim j2_offset As Integer = 0 
      For j2 As Integer = 0 To iSquare - 1 
       Dim j1_offset As Integer = 0 
       Dim j1_interleaved_offset As Integer = 0 
       For j1 As Integer = 0 To iSquare - 1 
        Dim i2_offset As Integer = 0 
        Dim i2_interleaved_offset As Integer = 0 
        Dim j_offset_value As Integer = j2_offset + j1_offset 
        For i2 As Integer = 0 To iSquare - 1 
         Dim offset_value As Integer = j_offset_value + i2_offset 
         Dim interleaved_value As Integer = j2_offset + i2_interleaved_offset + j1_interleaved_offset 
         For i1 As Integer = 0 To iSquare - 1 
          box = offset_value + i1 
          gridbox(box) = interleaved_value + i1 
          gridbox1(gridbox(box)) = j_offset_value 
         Next 
         i2_offset += iSquare 
         i2_interleaved_offset += Square2 
        Next 
        j1_offset += Square2 
        j1_interleaved_offset += iSquare 
       Next 
       j2_offset += Square3 
      Next 

更新 幾小時後的小隨訪。

這是一個數獨的程序,你可以找到它使用here

+0

爲什麼關閉請求? – Fredou 2009-02-20 23:17:26

+0

它做什麼*做*? – Tomalak 2009-02-20 23:21:04

+0

它是一個數獨程序中用來查找「盒子」內所有其他數字的東西,不需要每次需要時都進行雙循環,它在運行時計算出來 – Fredou 2009-02-20 23:35:55

回答

2

編輯:真正的終極力量的最終答案!

因此,對於gridbox,你基本上是採取我和j和交叉他們的數字基地(正方形)。例如,給定的i和j在鹼(規模),則是計算:

I(2).J(2)I(1)Ĵ(1)

其中(n)表示的數字基(刻度)。因此,這很容易加快速度:只需保持每個數字對網格框(...)的最終值的貢獻即可。

加快gridbox1(...)甚至更容易。基本上,你是計算:

Square * Square *(j\Square * Square + (j Mod Square)) 

現在,(j Mod Square)擴展到(j - j\Square*Square)從而降低了上面:

Square * Square *(j\Square * Square + (j - j\Square*Square)) 

這簡化爲:

Square * Square *(j\Square * Square + j - j\Square*Square) 

這簡化爲:

Square * Square * (j) 

下面是最後一個循環:

Dim Square2 = Square * Square 
Dim Square3 = Square2 * Square 
Dim Square4 = Square2 * Square2 

Dim j2_offset = 0 
Dim j2_interleaved_offset = 0 
Dim j2_value_offset= 0 
For j2 = 0 To Square - 1 
    Dim j1_offset = 0 
    Dim j1_interleaved_offset = 0 
    For j1 = 0 To Square - 1 
     Dim i2_offset = 0 
     Dim i1_interleaved_offset = 0 
     For i2 = 0 To Square - 1 
      For i1 = 0 To Square - 1 
       Dim box = j2_offset + j1_offset + i2_offset + i1 
       gridbox(box) = j2_interleaved_offset + i2_interleaved_offset + j1_interleaved_offset + i1 
       gridbox1(gridbox(box)) = j2_offset + j1_offset 
      Next 
      i2_offset += Square 
      i2_interleaved_offset += Square2 
     Next 
     j1_offset += Square2 
     j1_interleaved_offset += Square 
    Next 
    j2_offset += Square3 
    j2_interleaved_offset += Square3 
Next 
2

如果我只猜中了,這也應該這樣做:

For j1 = 0 To square - 1 
    For j2 = 0 To square - 1 
    j = j1 * square + j2 
    For i1 = 0 To square - 1 
     For i2 = 0 To square - 1 
     box = (j * squareExp2) + i1 * square + i2 
     gridbox(box) = (((j1 * square + i1) * square + j2) * square) + i2 
     gridbox1(gridbox(box)) = j * squareExp2 
     Next 
    Next 
    Next 
Next 
2

看起來這是產生從線性地址重新映射表格以相同的數據按照莫頓順序偏移。 gridbox(y*squareExp2+x)是調整數據中的偏移量,gridbox1(x)是塊的偏移量。

這類事情通常表示爲按位運算的序列,但是這不會推廣到任何維度的塊(例如3x3)。

我不知道任何更方便的做它的任意塊大小。必須知道塊的座標(它是(i\square,j\square)),塊內的座標必須已知(它是(i mod square,j mod square)),塊的座標的每個部分必須按該維的塊大小(squareExp2*square,j-wards,和squareExp2,i-wards),並且塊內的座標必須在j方向上按塊的步幅縮放(square)。所以如果沒有超過這些計算的參與(看起來沒有,儘管我可能弄錯了),那麼我不確定還有什麼可以被擠掉的。