查看完整版本: vb6 插牌的程式
頁: [1]

sss86523 發表於 2014-7-27 01:09 PM

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

請把題目的意思詳細描述,
就你的範例與文字內容來看,
我完全無法理解「插牌的順序」是怎樣定義。
麻煩請定義清楚。

sss86523 發表於 2014-7-27 07:48 PM

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-27 09:52 PM

本帖最後由 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>

sam30525sam 發表於 2014-7-28 09:49 AM

早上花了點時間來寫你的程式,我後來發現有三種解法,本來想把三種解法都寫出來,
但是發現會耽誤到我的正事,就把最有趣的一種解法寫出來而已。

因為從文中,我覺得這是屬於作業文,
所以我只PO出結果,等過一段時間後我在PO出程式碼,
程式碼不長,大概100行而已。


<br><br><br><br><br><div></div>

sss86523 發表於 2014-7-28 12:57 PM

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:29 PM

本帖最後由 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]