頁:
[1]
vb6 插牌的程式
想請問各位大大一個題目,現在有8個數字,假設62518473,我要用插牌的方式讓他逐一變化(要按照順序插),如下12345678 (一開始固定12345678)
23456718 (再來1要插到中間)
34567218 (再來是2)
45672183 (再來是3 以此類推)
56721843
67251843
76251843
62518473 (最後要變成題目的要求)
不能超過10次,
我這題真的想了好久,就是不知道要用甚麼原理寫,
新的排插進去,順序又變了。 求大大給我點意見。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div> 請把題目的意思詳細描述,
就你的範例與文字內容來看,
我完全無法理解「插牌的順序」是怎樣定義。
麻煩請定義清楚。
sam30525sam 發表於 2014-7-27 06:38 PM static/image/common/back.gif
請把題目的意思詳細描述,
就你的範例與文字內容來看,
我完全無法理解「插牌的順序」是怎樣定義。
若現在有 8 張撲克牌,點數分別是1 點至8 點,各張牌的點數都不同,並且8 張牌已依點數
由小到大排列。若要改變排列順序,只能用「插牌」動作。假設一個「插牌」的動作,
可以將順序中的第1 張牌(首牌)插入其他牌的後面,形成1 個新的牌組順序。我們現在用
1 個長度為8 的字串,表示1 個牌組順序。例如以字串「12345678」,表示這8 張牌現在依
其點數由小到大排列。如果我們進行第1 次「插牌」動作,假設將「牌1」(首牌)放到「牌
5」之後,就形成新的牌組順序「23451678」。如果要進行第2 次的「插牌」,就將「牌2」
(首牌)插入其他牌之後,即可形成下一個牌組順序。
現在給一個「目的地牌組順序」,請從牌組順序「12345678」開始,用最多7 次的「插牌」
動作,最後轉換成「目的地牌組順序」。
輸...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 本帖最後由 sam30525sam 於 2014-7-28 09:03 AM 編輯
sss86523 發表於 2014-7-27 07:48 PM static/image/common/back.gif
若現在有 8 張撲克牌,點數分別是1 點至8 點,各張牌的點數都不同,並且8 張牌已依點數
由小到大排列。若 ...
原來你是要求「如何插牌的順序」,我正好就是要問「插牌的順序」。
先問一下你有沒有考慮過最簡單的「暴力破解法」?
另外如果要求如何插牌,這個很簡單可以解,
我剛剛看了一下就解出來了,不用暴力破解法也是有一定的規律存在,
不管怎樣插牌7次以內一定可以達到你所要的「目的順序」。
給你一個思考方向,
1. 那些數字不能移動?那些數字可以移動?
2. 整理與歸納
如果再不懂,你先嘗試用暴力破解法看看,
這題很有意思,有空我在寫出程式碼。
順帶一提,
如果用暴力破解法,也才40320種解,比較好寫,好處是只要執行一次就可知全部解,壞處是浪費空間。
如果是用規律來解,程式碼要寫得多一點點,壞處是每次都要計算,好處是不用浪費記憶體空間。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 早上花了點時間來寫你的程式,我後來發現有三種解法,本來想把三種解法都寫出來,
但是發現會耽誤到我的正事,就把最有趣的一種解法寫出來而已。
因為從文中,我覺得這是屬於作業文,
所以我只PO出結果,等過一段時間後我在PO出程式碼,
程式碼不長,大概100行而已。
<br><br><br><br><br><div></div> sam30525sam 發表於 2014-7-28 09:49 AM static/image/common/back.gif
早上花了點時間來寫你的程式,我後來發現有三種解法,本來想把三種解法都寫出來,
但是發現會耽誤到我的正 ...
我是今年商科程式設計選手,在練歷屆試題,
我這題想太久了= =,看來還要多多磨練,
我知道更快的解法了,這規則好特別,不知道規則真的好難解...
還是謝謝你的幫忙:D...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 本帖最後由 sam30525sam 於 2014-7-28 01:30 PM 編輯
sss86523 發表於 2014-7-28 12:57 PM static/image/common/back.gif
我是今年商科程式設計選手,在練歷屆試題,
我這題想太久了= =,看來還要多多磨練,
我知道更快的解法了 ...
如果你知道了解法,
那我公布我三個解法的其中一個。
因為我主要用C#寫完再用某軟體轉成VB,
太久沒寫VB了,現在也只會看,寫下去都會卡卡的,
所以你看C#跟VB參數名字會不一樣,
C#是我寫的,VB是用軟體翻過來的。
主要程式碼
Private Sub MoveNumbersApp()
Dim str As String = "12345678"
Dim targetNumbers As String = "62518473"
Dim str3 As String = str
Console.WriteLine("第0次:{0}", str3)
Dim i As Integer = 1
Do While (i <= 7)
If (str3 = targetNumbers) Then
Exit Do
End If
str3 = Me.MoveNumbers(i, targetNumbers)
Console.WriteLine("第{0}次:{1}", i, str3)
i += 1
Loop
End Sub
Private Function MoveNumbers(ByVal As Integer, ByVal targetNumbers As String) As String
Dim str As String = Me.FirstPart()
Dim str2 As String = Me.SecondPart(, targetNumbers)
Return (str & str2)
End Function
Private Function FirstPart(ByVal As Integer) As String
Select Case
Case 1
Return "234567"
Case 2
Return "34567"
Case 3
Return "4567"
Case 4
Return "567"
Case 5
Return "67"
Case 6
Return "7"
End Select
Return ""
End Function
Private Function SecondPart(ByVal As Integer, ByVal targetNumbers As String) As String
Dim separator As String() = Nothing
Select Case
Case 1
separator = New String() { "2", "3", "4", "5", "6", "7" }
Exit Select
Case 2
separator = New String() { "3", "4", "5", "6", "7" }
Exit Select
Case 3
separator = New String() { "4", "5", "6", "7" }
Exit Select
Case 4
separator = New String() { "5", "6", "7" }
Exit Select
Case 5
separator = New String() { "6", "7" }
Exit Select
Case 6
separator = New String() { "7" }
Exit Select
Case Else
separator = New String(0 - 1) {}
Exit Select
End Select
Return String.Join("", targetNumbers.Split(separator, StringSplitOptions.RemoveEmptyEntries))
End Function
client端呼叫
Me.MoveNumbersApp
======================
以下為C#版
主要程式碼
// 移動數字程式
private void MoveNumbersApp()
{
string sourceNumbers = "12345678";
string targetNumbers = "62518473";
string stepNumbers = sourceNumbers;
Console.WriteLine("第0次:{0}", stepNumbers);
for (int i = 1; i <= 7; i++)
{
if (stepNumbers == targetNumbers)
{
break;
}
else
{
stepNumbers = MoveNumbers(i, targetNumbers);
Console.WriteLine("第{0}次:{1}", i, stepNumbers);
}
}
}
// 移動數字
private string MoveNumbers(int step, string targetNumbers)
{
string firstPartString = FirstPart(step);
string secondPartString = SecondPart(step, targetNumbers);
string returnString = firstPartString + secondPartString;
return returnString;
}
// 前半段字串
private string FirstPart(int step)
{
string returnString;
switch (step)
{
case 1:
returnString = "234567";
break;
case 2:
returnString = "34567";
break;
case 3:
returnString = "4567";
break;
case 4:
returnString = "567";
break;
case 5:
returnString = "67";
break;
case 6:
returnString = "7";
break;
default:
returnString = "";
break;
}
return returnString;
}
// 後半段字串
private string SecondPart(int step, string targetNumbers)
{
string[] separator = null;
switch (step)
{
case 1:
separator = new string[] { "2", "3", "4", "5", "6", "7" };
break;
case 2:
separator = new string[] { "3", "4", "5", "6", "7" };
break;
case 3:
separator = new string[] { "4", "5", "6", "7" };
break;
case 4:
separator = new string[] { "5", "6", "7" };
break;
case 5:
separator = new string[] { "6", "7" };
break;
case 6:
separator = new string[] { "7" };
break;
default:
separator = new string[] { };
break;
}
string returnString = string.Join("", targetNumbers.Split(separator, StringSplitOptions.RemoveEmptyEntries));
return returnString;
}
client端呼叫
this.MoveNumbersApp();
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁:
[1]