- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我还想说,我不关心算法生成哪个解,因为我知道对于相同的步数有很多解。
我只想要任何对当前拼图来说可能移动最少的解决方案。
谢谢。我真的没有任何模式可以想到,我所知道的是最小的数字必须放在前面,最大的数字必须放在后面,但诀窍是它一次移动 2 个数字,一个从前面,一个从后面一起移动,就像使用更可修改的堆栈一起排序。
这个游戏只包含 2 个 Action ..
这是函数代码
Public Function CyclicRotationOffset(ByVal data() As Byte, ByVal beginOffset As Integer, ByVal leftDirection As Boolean) As Byte()
'Left Direction = true
'--------------------------------------------------------
'Shifted cyclically rotation If [a, b, c] then [b, c, a]
'--------------------------------------------------------
'Left Direction = false
'--------------------------------------------------------
'Shifted cyclically rotation If [a, b, c] then [c, a, b]
'--------------------------------------------------------
If beginOffset = UBound(data) Then
'last byte cannot do anything.
Return data
End If
Dim newdata() As Byte
ReDim newdata(UBound(data))
If leftDirection = True Then
newdata(UBound(newdata)) = data(beginOffset) '1st element will be last.
For i = beginOffset To UBound(data) - 1
newdata(i) = data(i + 1)
Next i
Else
newdata(beginOffset) = data(UBound(data)) 'last element will be first.
For i = beginOffset + 1 To UBound(data)
newdata(i) = data(i - 1)
Next i
End If
If beginOffset > 0 Then
Buffer.BlockCopy(data, 0, newdata, 0, beginOffset)
End If
Return newdata
End Function
举两个例子
--------------------------------------------
数据,用蛮力(和函数)在 6 个 Action 中解决。
2, 7, 3, 1, 6, 4, 5, 8, 9
----------------------------------------------
蛮力强制旋转
3左3右
----------------------------------------------
1、左
2、左
0,对
6、对
3、左
5、对
--------------------------------------------
2, 3, 1, 6, 4, 5, 8, 9, 7
2, 3, 6, 4, 5, 8, 9, 7, 1
1, 2, 3, 6, 4, 5, 8, 9, 7
1, 2, 3, 6, 4, 5, 7, 8, 9
1, 2, 3, 4, 5, 7, 8, 9, 6
1, 2, 3, 4, 5, 6, 7, 8, 9 <- 最后一个产生排序的答案
----------------------------------------------
这是一个更难的例子(这个难住了我)
7 步解决(使用蛮力)
数据=
3、9、7、4、2、5、1、6、8
回答=
1、2、3、4、5、6、7、8、9
4 左,3 右
采取的行动
6、左
0,对
3、左
7、对
2、左
3、左
1、对
3, 9, 7, 4, 2, 5, 6, 8, 1
1, 3, 9, 7, 4, 2, 5, 6, 8
1, 3, 9, 4, 2, 5, 6, 8, 7
1, 3, 9, 4, 2, 5, 6, 7, 8
1, 3, 4, 2, 5, 6, 7, 8, 9
1, 3, 4, 5, 6, 7, 8, 9, 2
1、2、3、4、5、6、7、8、9
这是我的代码,它为第一个谜题找到 6 步解决方案,但是对于第二个谜题,它没有正确处理它,所以解决方案需要 14 步 而不是最佳7 个 Action 。
Public Structure OffsetMove
Dim moveId As Byte
Dim randomOffset As Byte
Public Sub New(ByVal moveId As Byte, ByVal randomOffset As Byte)
Me.moveId = moveId
Me.randomOffset = randomOffset
End Sub
End Structure
Public Function SortDataCyclic(ByVal data() As Byte) As List(Of OffsetMove)
Dim answer() As Byte
ReDim answer(UBound(data))
Buffer.BlockCopy(data, 0, answer, 0, data.Length)
Array.Sort(answer)
Dim newdata() As Byte
ReDim newdata(UBound(data))
Buffer.BlockCopy(data, 0, newdata, 0, data.Length)
Dim i As Long = 0
Dim j As Long = 0
Dim k As Long = 0
Dim l As Long = 0
Dim solutionCount As Integer = 0
Dim movesTaken As New List(Of OffsetMove)
Debug.Print("---------------------------------------------")
Dim sortedPairs As New List(Of Byte)
While j < 8
If sortedPairs.Count >= 3 Then
'Insertion right cyclic rotations go here
While l < 9
k = 0
While k < 9
If newdata(k) > newdata(8) Then Exit While
k += 1
End While
If k = 9 Then
'fully sorted already, nothing left to insert.
Exit While
End If
newdata = CyclicRotationOffset(newdata, k, False)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
l += 1
End While
'Exit the while, everything is sorted.
Exit While
'1, 2, x, x, x, x
ElseIf j + 1 < 9 AndAlso _
newdata(j + 1) = (newdata(j) + 1) Then
sortedPairs.Add(j)
j += 2
'1, x, 2, x, x, x
ElseIf j + 2 < 9 AndAlso _
newdata(j + 2) = (newdata(j) + 1) Then
newdata = CyclicRotationOffset(newdata, (j + 1), True)
movesTaken.Add(New OffsetMove(0, (j + 1)))
printDebug(newdata)
j = 0
'No pair pattern at all.
Else
newdata = CyclicRotationOffset(newdata, j, True)
movesTaken.Add(New OffsetMove(0, j))
printDebug(newdata)
End If
End While
Return movesTaken
End Function
Public Sub printDebug(ByVal data() As Byte)
Debug.Print(data(0) & ", " & data(1) & ", " & data(2) & ", " & data(3) & ", " & data(4) & ", " & data(5) & ", " & data(6) & ", " & data(7) & ", " & data(8))
End Sub
最佳答案
我使用了您的代码,得到了与您不同的结果集。我认为部分原因与 while 循环中 sortedPairs.Count 的逻辑有关。我也对 I、j、k 和 l 之间的差异感到困惑。因此,我使用一些略有不同的逻辑重写了您的 While 循环。
Dim currentNumber As Integer = 1
Dim currentPositionOfNumber As Integer = 0
While currentNumber - 1 < 8
currentPositionOfNumber = GetIndexOfNumber(newdata, currentNumber)
If currentNumber - 1 = currentPositionOfNumber Then
'do nothing
ElseIf currentNumber = currentPositionOfNumber Then
'If the number needed to move is in the spot to the immediate right of where it needs to be, then just rotate left once
newdata = CyclicRotationOffset(newdata, currentNumber - 1, True)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
ElseIf currentPositionOfNumber = 8 Then
'if number needed to move is in last position, then rotate it to correct position
newdata = CyclicRotationOffset(newdata, currentNumber - 1, False)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
ElseIf currentNumber = newdata(currentPositionOfNumber + 1) - 1 Then
'if the number is not in any of the above positions, but the number immediately to it's right is the next higher, then just rotate left until the pair are in correct position
Do Until GetIndexOfNumber(newdata, currentNumber) = currentNumber - 1
newdata = CyclicRotationOffset(newdata, currentNumber - 1, True)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
Loop
Else
'rotate left once, then rotate right to correct position
newdata = CyclicRotationOffset(newdata, currentPositionOfNumber, True)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
newdata = CyclicRotationOffset(newdata, currentNumber - 1, False)
movesTaken.Add(New OffsetMove(1, k))
printDebug(newdata)
End If
currentNumber += 1
End While
我还有一个函数可以找到正在评估的 currentNumber 在数组中的位置
Public Function GetIndexOfNumber(data() As Byte, number As Integer) As Integer
For i = 0 To 8
If data(i) = number Then Return i
Next
End Function
有了这个,我得到了以下结果......测试 1 = 6 步测试 2 = 7 步
关于VB.NET 以最少的步骤自定义复杂排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17803800/
我是在项目中使用 keras 的新手。我一直在我的模型中使用generator。 我真的很困惑我应该输入什么值 1) In fit_generator : steps_per_epoch & vali
假设我们有如下情况: A has to give $10 to B. B has to give $20 to C. C has to give $10 to D. 现在这种情况可以简化为: A lo
我正在尝试对特定列(在工作表“OA”中)进行相对引用,我需要在 110 的步骤中检索新工作表中的单元格内容 例如, =OA!$AB217 =OA!$AB327 =OA!$AB437 与其在每个单元格中
我的 PowerShell 控制台启动时间很慢(总是等待超过 5 秒),并且希望获得有关故障排除步骤的建议,以找出瓶颈可能在哪里? 我已经阅读了关于运行脚本的内容,-NoProfile防止模块等加载很
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
这是我的code : &n
为什么 (2) c.ERR(模棱两可)?第一个方法参数 - char ('a') 被扩展为 float => 匹配。 如果找到匹配项,是否无需继续执行第 2 步(装箱/拆箱)或第 3 步(尝试可变参数
我有一个函数,它处理一个包含 6100 个列表项的列表。当列表只有 300 个项目时,该代码可以正常工作。但是立即与 6100 崩溃。有没有一种方法可以遍历这 6100 个项目,一次说 30 个,然后
1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装
我创建了一个类似于 primeNG page 的步骤组件我想把他放在一个 dynamic dialog 里面但在应用它之后,“第 1 步”和“第 2 步”不会呈现。 查看代码,我发现关键部分是我们打开
我在理解描述的 MixColumns 步骤时遇到问题 here . 我知道扩散,这一切都是有道理的,因为它指出每列都被视为多项式并乘以 GF(2^8) 的模。 但是..乘以GF(2 ^ 8)。尽管域仍
根据我对 TeamCity 工作原理的观察,我注意到在所有步骤执行完毕后评估构建失败条件。这很烦人,因为如果满足任何构建失败条件,我不能有一个不会执行的步骤。 我不是指常见的构建失败条件,例如“至少一
基于这篇试图在我的环境中测试管道代码的帖子。但它给出了以下错误消息。如何修复他的管道代码? ERROR: Unable to find project for artifact copy: test
我参与了一个项目,需要向我的一位同事提供生产数据的子集(日期范围),以进行故障排除。我想将经过清理的生产数据子集插入新的数据库表中我的同事可以访问。请提出实现此目标的最佳方法。 最佳答案 最简单的方法
我有这样的场景: 鉴于我去这个页面 当我输入 cucumber 时 然后我点击 然后我应该看到文字 我不应该看到这条线 如果我运行这个场景,它将执行所有 5 个步骤。但是我想跳过第4步(然后我应该看到
是否有任何功能可以避免 m 文件的绘图输出? 我的意思是我在文件的开头放置了一个函数(如 clc),然后所有绘图函数都被阻止。 最佳答案 您可以使用自己的(嵌套在您的函数内或同一目录中)重载内置绘图函
我是小 cucumber 语言的新手,这在我看来是非常基本的问题,但我找不到答案。 我知道可以在 Gherking 中编写多行步骤参数,如下所示: Given a blog post named "R
即使其中一个步骤失败,有没有办法继续执行 Cucumber Steps。在我当前的设置中,当一个步骤失败时, cucumber 会跳过剩余的步骤......我想知道是否有某种方法可以设置 cucumb
start-step-stop 码是一种数据压缩技术,用于压缩相对较小的数字。 该代码的工作原理如下:它具有三个参数,start、step 和 stop。 Start 确定用于计算前几个数字的位数。
我是一名优秀的程序员,十分优秀!