伊莉討論區

標題: vb6 插牌的程式 [打印本頁]

作者: sss86523    時間: 2014-7-27 01:09 PM     標題: vb6 插牌的程式

想請問各位大大一個題目,現在有8個數字,假設62518473,我要用插牌的方式讓他逐一變化(要按照順序插),如下
12345678 (一開始固定12345678)
23456718 (再來1要插到中間)
34567218 (再來是2)
45672183 (再來是3 以此類推)
56721843
67251843
76251843
62518473  (最後要變成題目的要求)

不能超過10次,
我這題真的想了好久,就是不知道要用甚麼原理寫,
新的排插進去,順序又變了。 求大大給我點意見。

作者: sam30525sam    時間: 2014-7-27 06:38 PM

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

作者: sss86523    時間: 2014-7-27 07:48 PM

sam30525sam 發表於 2014-7-27 06:38 PM
請把題目的意思詳細描述,
就你的範例與文字內容來看,
我完全無法理解「插牌的順序」是怎樣定義。

若現在有 8 張撲克牌,點數分別是1 點至8 點,各張牌的點數都不同,並且8 張牌已依點數
由小到大排列。若要改變排列順序,只能用「插牌」動作。假設一個「插牌」的動作,
可以將順序中的第1 張牌(首牌)插入其他牌的後面,形成1 個新的牌組順序。我們現在用
1 個長度為8 的字串,表示1 個牌組順序。例如以字串「12345678」,表示這8 張牌現在依
其點數由小到大排列。如果我們進行第1 次「插牌」動作,假設將「牌1」(首牌)放到「牌
5」之後,就形成新的牌組順序「23451678」。如果要進行第2 次的「插牌」,就將「牌2」
(首牌)插入其他牌之後,即可形成下一個牌組順序。
現在給一個「目的地牌組順序」,請從牌組順序「12345678」開始,用最多7 次的「插牌」
動作,最後轉換成「目的地牌組順序」。

作者: sam30525sam    時間: 2014-7-27 09:52 PM

本帖最後由 sam30525sam 於 2014-7-28 09:03 AM 編輯
sss86523 發表於 2014-7-27 07:48 PM
若現在有 8 張撲克牌,點數分別是1 點至8 點,各張牌的點數都不同,並且8 張牌已依點數
由小到大排列。若 ...

原來你是要求「如何插牌的順序」,我正好就是要問「插牌的順序」。

先問一下你有沒有考慮過最簡單的「暴力破解法」?

另外如果要求如何插牌,這個很簡單可以解,
我剛剛看了一下就解出來了,不用暴力破解法也是有一定的規律存在,
不管怎樣插牌7次以內一定可以達到你所要的「目的順序」。

給你一個思考方向,
1. 那些數字不能移動?那些數字可以移動?
2. 整理與歸納

如果再不懂,你先嘗試用暴力破解法看看,
這題很有意思,有空我在寫出程式碼。

順帶一提,
如果用暴力破解法,也才40320種解,比較好寫,好處是只要執行一次就可知全部解,壞處是浪費空間。
如果是用規律來解,程式碼要寫得多一點點,壞處是每次都要計算,好處是不用浪費記憶體空間。



作者: sam30525sam    時間: 2014-7-28 09:49 AM

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

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

[attach]102759127[/attach]

作者: sss86523    時間: 2014-7-28 12:57 PM

sam30525sam 發表於 2014-7-28 09:49 AM
早上花了點時間來寫你的程式,我後來發現有三種解法,本來想把三種解法都寫出來,
但是發現會耽誤到我的正 ...

我是今年商科程式設計選手,在練歷屆試題,
我這題想太久了= =,看來還要多多磨練,
我知道更快的解法了,這規則好特別,不知道規則真的好難解...
還是謝謝你的幫忙
作者: sam30525sam    時間: 2014-7-28 01:29 PM

本帖最後由 sam30525sam 於 2014-7-28 01:30 PM 編輯
sss86523 發表於 2014-7-28 12:57 PM
我是今年商科程式設計選手,在練歷屆試題,
我這題想太久了= =,看來還要多多磨練,
我知道更快的解法了 ...

如果你知道了解法,
那我公布我三個解法的其中一個。

因為我主要用C#寫完再用某軟體轉成VB,
太久沒寫VB了,現在也只會看,寫下去都會卡卡的,
所以你看C#跟VB參數名字會不一樣,
C#是我寫的,VB是用軟體翻過來的。

主要程式碼
  1. Private Sub MoveNumbersApp()
  2.     Dim str As String = "12345678"
  3.     Dim targetNumbers As String = "62518473"
  4.     Dim str3 As String = str
  5.     Console.WriteLine("第0次:{0}", str3)
  6.     Dim i As Integer = 1
  7.     Do While (i <= 7)
  8.         If (str3 = targetNumbers) Then
  9.             Exit Do
  10.         End If
  11.         str3 = Me.MoveNumbers(i, targetNumbers)
  12.         Console.WriteLine("第{0}次:{1}", i, str3)
  13.         i += 1
  14.     Loop
  15. End Sub

  16. Private Function MoveNumbers(ByVal [step] As Integer, ByVal targetNumbers As String) As String
  17.     Dim str As String = Me.FirstPart([step])
  18.     Dim str2 As String = Me.SecondPart([step], targetNumbers)
  19.     Return (str & str2)
  20. End Function

  21. Private Function FirstPart(ByVal [step] As Integer) As String
  22.     Select Case [step]
  23.         Case 1
  24.             Return "234567"
  25.         Case 2
  26.             Return "34567"
  27.         Case 3
  28.             Return "4567"
  29.         Case 4
  30.             Return "567"
  31.         Case 5
  32.             Return "67"
  33.         Case 6
  34.             Return "7"
  35.     End Select
  36.     Return ""
  37. End Function

  38. Private Function SecondPart(ByVal [step] As Integer, ByVal targetNumbers As String) As String
  39.     Dim separator As String() = Nothing
  40.     Select Case [step]
  41.         Case 1
  42.             separator = New String() { "2", "3", "4", "5", "6", "7" }
  43.             Exit Select
  44.         Case 2
  45.             separator = New String() { "3", "4", "5", "6", "7" }
  46.             Exit Select
  47.         Case 3
  48.             separator = New String() { "4", "5", "6", "7" }
  49.             Exit Select
  50.         Case 4
  51.             separator = New String() { "5", "6", "7" }
  52.             Exit Select
  53.         Case 5
  54.             separator = New String() { "6", "7" }
  55.             Exit Select
  56.         Case 6
  57.             separator = New String() { "7" }
  58.             Exit Select
  59.         Case Else
  60.             separator = New String(0  - 1) {}
  61.             Exit Select
  62.     End Select
  63.     Return String.Join("", targetNumbers.Split(separator, StringSplitOptions.RemoveEmptyEntries))
  64. End Function
複製代碼
client端呼叫
  1. Me.MoveNumbersApp
複製代碼
======================

以下為C#版

主要程式碼
  1.         // 移動數字程式
  2.         private void MoveNumbersApp()
  3.         {
  4.             string sourceNumbers = "12345678";
  5.             string targetNumbers = "62518473";

  6.             string stepNumbers = sourceNumbers;
  7.             Console.WriteLine("第0次:{0}", stepNumbers);
  8.             for (int i = 1; i <= 7; i++)
  9.             {
  10.                 if (stepNumbers == targetNumbers)
  11.                 {
  12.                     break;
  13.                 }
  14.                 else
  15.                 {
  16.                     stepNumbers = MoveNumbers(i, targetNumbers);
  17.                     Console.WriteLine("第{0}次:{1}", i, stepNumbers);
  18.                 }
  19.             }        
  20.         }

  21.         // 移動數字
  22.         private string MoveNumbers(int step, string targetNumbers)
  23.         {
  24.             string firstPartString = FirstPart(step);
  25.             string secondPartString = SecondPart(step, targetNumbers);

  26.             string returnString = firstPartString + secondPartString;

  27.             return returnString;
  28.         }

  29.         // 前半段字串
  30.         private string FirstPart(int step)
  31.         {
  32.             string returnString;

  33.             switch (step)
  34.             {
  35.                 case 1:
  36.                     returnString = "234567";
  37.                     break;

  38.                 case 2:
  39.                     returnString = "34567";
  40.                     break;

  41.                 case 3:
  42.                     returnString = "4567";
  43.                     break;

  44.                 case 4:
  45.                     returnString = "567";
  46.                     break;

  47.                 case 5:
  48.                     returnString = "67";
  49.                     break;

  50.                 case 6:
  51.                     returnString = "7";
  52.                     break;

  53.                 default:
  54.                     returnString = "";
  55.                     break;
  56.             }

  57.             return returnString;
  58.         }

  59.         // 後半段字串
  60.         private string SecondPart(int step, string targetNumbers)
  61.         {
  62.             string[] separator = null;
  63.             switch (step)
  64.             {
  65.                 case 1:
  66.                     separator = new string[] { "2", "3", "4", "5", "6", "7" };
  67.                     break;

  68.                 case 2:
  69.                     separator = new string[] { "3", "4", "5", "6", "7" };
  70.                     break;

  71.                 case 3:
  72.                     separator = new string[] { "4", "5", "6", "7" };
  73.                     break;

  74.                 case 4:
  75.                     separator = new string[] { "5", "6", "7" };
  76.                     break;

  77.                 case 5:
  78.                     separator = new string[] { "6", "7" };
  79.                     break;

  80.                 case 6:
  81.                     separator = new string[] { "7" };
  82.                     break;

  83.                 default:
  84.                     separator = new string[] { };
  85.                     break;
  86.             }

  87.             string returnString = string.Join("", targetNumbers.Split(separator, StringSplitOptions.RemoveEmptyEntries));

  88.             return returnString;
  89.         }
複製代碼
client端呼叫
  1. this.MoveNumbersApp();
複製代碼





歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!