2009-02-20 64 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)。所以如果没有超过这些计算的参与(看起来没有,尽管我可能弄错了),那么我不确定还有什么可以被挤掉的。