gpt4 book ai didi

vb.net - 可以将其线程化以更快地运行吗?

转载 作者:行者123 更新时间:2023-12-03 12:49:21 25 4
gpt4 key购买 nike

我目前正在编写一个解决脑筋急转弯的程序,

工作原理:
仅使用数字1-9一次,制作四个角,每个对角线= 26
提示使中间7

无论如何,我的代码基本上从“111111111”开始并递增计数,每次检查是否与所需参数匹配。

代码:

    Public Class Main
Dim count As Integer
Dim split() As Char
Dim done As Boolean
Dim attempts As Integer
Private Sub IncreaseOne()
If count < 999999999 Then
count += 1
Else
done = True
End If
If CStr(count).Contains("0") Then

count = CStr(count).Replace("0", "1")
End If
End Sub

Private Sub Reset()
count = 111111111
attempts = 0
End Sub

Private Sub IntToLbl()
split = CStr(count).ToCharArray
lbl1.Text = split(0)
lbl2.Text = split(1)
lbl3.Text = split(2)
lbl4.Text = split(3)
lbl5.Text = split(4)
lbl6.Text = split(5)
lbl7.Text = split(6)
lbl8.Text = split(7)
lbl9.Text = split(8)
lblAttempts.Text = "Attempt: " & attempts
End Sub
Private Sub Check()
attempts += 1
If split(0) + split(1) + split(7) + Int(8) = 26 And split(0) + split(2) + split(4) + split(6) + split(8) = 26 And split(1) + split(3) + split(4) + split(5) + split(7) = 26 Then
If CStr(count).Contains("1") And CStr(count).Contains("2") And CStr(count).Contains("3") And CStr(count).Contains("4") _
And CStr(count).Contains("5") And CStr(count).Contains("6") And CStr(count).Contains("7") And CStr(count).Contains("8") _
And CStr(count).Contains("9") Then
ListBox1.Items.Add("A" & attempts & ": " & CStr(count))
End If
End If
End Sub

Private Sub Act()
While done = False
IncreaseOne()
IntToLbl()
Check()
End While
tr.Abort()
End Sub
Dim suspended As Boolean = False
Dim tr As New System.Threading.Thread(AddressOf Act)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSolve.Click

If suspended = True Then
tr.Resume()
suspended = False
Else
If tr.IsAlive = False Then
Reset()
tr.Start()
CheckForIllegalCrossThreadCalls = False
Else
Dim Reply = MsgBox("Thread is running! Stop the thread?", MsgBoxStyle.YesNo, "Error!")
If Reply = MsgBoxResult.Yes Then
tr.Suspend()
suspended = True
End If
End If
End If
End Sub

Private Sub Main_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
tr.Abort()
End Sub

Private Sub tr2_Tick(sender As Object, e As EventArgs) Handles tr2.Tick
IncreaseOne()
IntToLbl()
Check()
End Sub
End Class

最佳答案

在使用线程之前,您应该1)降低算法复杂度,2)提高其效率。

1)由于复杂性,由于数字只能出现一次,因此您有9个! =做362.880测试,比完整扫描少27.557倍。
我猜到那时您已经可以在大多数计算机上实时运行了,但是对于某些组合,您可以在测试所有子组合之前停止测试(expl:如果第一个对角线不是26,则不需要测试其他项目的排列)。这样,您可以减少更多的测试。
减少案件数量的另一种方法是使用对称性。在这里,每旋转1步或2步,水平或垂直翻转都不会影响结果,这又使测试计数减少了X16。

2)为了提高效率,使用整数数组而不是字符串将为您带来巨大的速度提升。

我做了一个jsfiddle(在javascript中),那只是测试9!元素并使用数组,它立即给出结果,所以我没有进一步寻找早期停止/对称性。

一个解决方案是,例如:3,2,7,5,9,6,1,4,8
这使得:

3        6
2 1
7
4 5
8 9

这似乎还可以。

fiddle 在这里: http://jsfiddle.net/HRdyf/2/

数字以这种方式编码:第一个对角线有5个第一位数字,
中心项目的索引为2,其余4个为第二对角线,除了
它的核心项目。
(可能有更有效的方式对数组允许进行编码,如所解释的
尽早停止一些测试。)

Rq:我们可以找到所有关于数学的解决方案:

让我们将c1,c2,c3,c4称为四个角,将c称为中心点,将d11,d12,d21,d22称为两个角
两个对角线的剩余点。
然后
1)c1 + c2 + c3 + c4 = 26
2)c1 + d11 + m + d12 + c3 = 26
3)c2 + d21 + m + d22 + c4 = 26
4)所有点都不同并且在1..9范围内。
5)(从4开始):所有点的总和= 45(从1到9的总和)

6)从5)和1)-> d11 + d12 + m + d21 + d22 = 45-26 = 19
(内点总数=总数-角点总数)

7)现在添加2)和3)并使用1)和6)我们有19 + 26 + m = 26 + 26
所以--- >>> m = 7
8)考虑1),4)和7),我们看到我们不能用四个整数达到26
不使用9和8而不是7(不使用7时我们可以达到的最大值
和9是8 + 6 + 5 + 4 = 25,没有7和8时达到的最大值是9 + 6 + 5 + 4 = 24)
所以->两个角的值为9,8。
9)使用8),1),7)和4):另外两个角只能是6,3或5,4
(如果r1和r2不是9个角或8个角,则r1 + r2 = 9)

此时:中心为7,角为[4,5,8,9]或[3,6,8,9](和排列)
对于[4,5,8,9]->保持为[1,2,3,6](总和= 12)
对于[3,6,8,9]->保持为[1,2,4,5](总和= 12)

我们不能在同一对角线上有9和8,因为8 + d11 + 7 + d12 + 9 = 26使d11 + d12 = 2
可能考虑4)

让我们考虑转角= [4,5,8,9]的情况,并查看对角线从9开始的末端。
4或5。
4:9 + d11 + 7 + d12 + 4 = 26-> d11 + d12 = 6->(3,1)是d11和d12的唯一解决方案-> d21和d22的剩余(2,6) 。
5->> d11 + d12 = 7->给定4)并使用4和5则无解

现在边角= [3,6,8,9]的情况下,还要考虑对角线从9开始的末端。它可能以6或3结束
3:d11 + d12 = 7(5,2)仅解决方案(4,3和6,1无法使用,因为正在使用3和6)
6:d11 + d12 = 10无解。 (6,4//7,3/8,2/9,1均使用旧图。)

--->因此,以9开头的对角线只能以4或3结尾。
演绎--->以8开头的对角线将以5结束(另一条以4结束)或6
(当另一个以3结尾时)。

有多少解决方案?
有4种可能性来选择9的位置,然后是9个对角线末端(4或3)的2个选择,然后是8个对角线末端的2个选择(从楼上或楼下开始),然后为d11,d12剩下4个可能性; d21,d22选择:如果我们选择4作为9的末尾,则选择[3,1] + [2,6],如果我们选择3作为9的末尾,则选择[5,2] + [1,4]。

4 * 2 * 2 * 4使64个解决方案组合。

关于vb.net - 可以将其线程化以更快地运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18283418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com