想想這題如何用程式解?... [論壇 - Ubuntu 程式設計]
QQQQQ
|
回覆: 想想這題如何用程式解?... |
|
---|---|---|
Anon:QQQQQ
|
QQQQQ 寫到: 最後我把每台電梯的(M,N)解 換成 合法操作的排列組合, 也就是第一台17樓的電梯(M,N)=(1,0)被換成8種操作順序, ([+8,0,0,0,0,0,0,0],[0,+8,0,0,0,0,0,0],...) 第二台... 之後再去作配對, 找出最終解..., 效率有比暴力解快多了, 但對於步驟要13步的第二級(21-23)題目, 仍然很耗時間...>"< 底下是第一級(21-25)的結果: 第一種狀況可配對出 89856 組解, 第二種狀況可配對出 283920 組解, 第三種狀況可配對出 786240 組解, 全部解有 1160016 組! 下面為程式輸出的一部份, 加入自己標示的 3種狀況的解 的個數: ===== 1 ===== <--- [1 - 89856] : 89856 組 [註1]:話說有沒有數學高手可以用數學直接算出最後有幾組解?!
2009/7/9 16:31
| b8ac6 d845d 6f4e8 b6683
|
|
![]() |
QQQQQ
|
回覆: 想想這題如何用程式解?... |
|
---|---|---|
Anon:QQQQQ
|
QQQQQ 寫到: 註3 應該不對了!! 因為剛想到一個例子, 若初始樓層是4樓, 則會有一解為 [+8 +8 +8 -13 +8] 最後樓層為 23 樓, 4 +8 +8 +8 -13 +8 = 23 但操作順序顛倒則不為其解... 4 +8 -13 +8 +8 +8 = 23 唉~希望破滅...G~ (過河遊戲解太多~~ =3=)
2009/7/9 22:23
| 81690 614c9 36612 3c7e4
|
|
![]() |
把它挖出來,有趣的題目 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員二級
![]() ![]() 註冊日期:
2009/4/17 14:44 所屬群組:
已註冊使用者 等級: 8
HP : 0 / 175
![]() |
本來要找數學軟體,
結果發現這題, 用程式解真的不太好寫, 花了很長一段時間才寫出來(這都過了好幾天了), 但是用手算就很快......(而且我還算錯...算出九步...=o=|||) 我先講一下我個人的推論
條件
推論 已知每一步都要移動兩台電梯-[1]
且任意一台電梯 A 的移動不影響另一台電梯 B 的移動-[2] 一台電梯不可能同時往上又往下-[3]
假設 xi 與 yi 分別代表電梯 A 向上與向下的次數,
假設現在有五台電梯其移動次數分別為
假設用 n 步找出解答, 2.任意步驟數若存在一個符合條件[A]的矩陣,則至少有兩組以上的解
在不考慮排列情況下,
設我們移動電梯次數的矩陣為 (X',Y') = (x1',..x5',y1',..,y5')
每次從 (X',Y') 中取出任意兩變數各加一,
由 [3]與[2] 知道,
#! /usr/bin/perl
#這裡指的是 25 跟 21 那個範圍
#這是指起始樓層
2009/11/29 17:03
|
||||||||||
![]() |
Blake
|
回覆: 把它挖出來,有趣的題目 |
|
---|---|---|
Anon:Blake
|
路過...
但覺真有趣,讓我想到以前求學,還蠻懷念以前寫小程式做數值分析~
2009/11/29 17:39
| 971b7 85c4c 85d5b fe382
|
|
![]() |
回覆: 想想這題如何用程式解?... |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2008/8/15 10:35 所屬群組:
已註冊使用者 等級: 4
HP : 0 / 78
![]() |
用 dynamic programming 解很簡單.
1. 先產生一個表格, 裡面記錄每一樓層要開門需要先移動到哪一樓層. 則 21-25 可直接開門 (起始狀態). 而 13-17 層 +8 後可開門, 34-38 層 -13 後可開門 (第一輪). 5-9 層 +8 後成為 13-17 層, 並代入之後部份... 如此擴張, 直到 1-49 層都有解, 產生以下表格 (請忽略第 0 層): 0 9 10 11 12 13 14 15 16 17 在產生表格的過程中另外記錄每一解需要變換幾次, 則可套入電梯起始樓層 (17,26,20,19,31) 計算出總共移動的回數. 2. 以 C1~C5 代表每一電梯移動的次數, S = C1 + C2 + C3 + C4 + C5. 因為一次需同時移動兩台電梯, 因此: * S 需為偶數 * C1~C5 都必需 <= S/2, 否則將無法完成配對 若 S 為單數, 則取 C1~C5 中最小者, 找出移動次數最少的電梯再修改. 在產生變換奇偶次數解的過程中發現, 21-25 可以移動到 29-33. 增加 3 或 5 次移動後有解. 因此直接將最短的解後面再額外加上 29-33 的解. 3. 最後配對時只要將 C1~C5 排序, 從次數最多的開始配對就可以了.
2009/12/4 9:46
|
||||||||||
![]() |
回覆: 想想這題如何用程式解?... |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員二級
![]() ![]() 註冊日期:
2009/4/17 14:44 所屬群組:
已註冊使用者 等級: 8
HP : 0 / 175
![]() |
Kevin Peng 寫到: 不好意思@@ 雖然看的懂理論的部份,但我看不懂那個表格, 可以請前輩講解的更詳細一點嗎? 謝謝^^ 雖然沒貼在這邊, 不過從發出那個程式碼之後, 我還有在修改, 關於 $ttl 那邊,算是很失策, 雖然知道 ci <= n , i=1..5 這點, 當初寫的時候卻沒注意到, 害我想說怎麼程式跑這麼久, 一直到改成去尋找最佳解時才發現 已經補上修正過的, 這是我後來用來尋找最佳解用的, 只要把 EN: for ($n=1;$n<=50;$n++) { 跟 last EN if ($a[0] + $a[1] + $a[2] + $a[3] + $a[4] == 2*$n); 紅色部份拆掉, 把 print "請輸入想要驗證的步驟數\n"; $n = <>; 加到 EN: for ($n=1;$n<=50;$n++) { 上方就變成原來的驗證程式了 補上我自己驗證21-23之間的最佳解 請輸入想給予的最大值範圍 23 請輸入想給予的最小值範圍 21 請輸入想要的第1個定值C 17 請輸入想要的第2個定值C 19 請輸入想要的第3個定值C 20 請輸入想要的第4個定值C 26 請輸入想要的第5個定值C 31 第9步有最佳解
2009/12/5 19:45
|
||||||||||
![]() |
回覆: 想想這題如何用程式解?... |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2008/8/15 10:35 所屬群組:
已註冊使用者 等級: 4
HP : 0 / 78
![]() |
這個表格是從目地值推算回起始值的, 主要為了避開從起始值開始的搜尋動作, 直接獲得最短的解. 產生表的運算很簡單, 而且重覆記錄在用同空間就可以了.
例如第 31 層開始的電梯, 查出第 31 項目的內容為 39. 表示 31 可以 +8 後套用 39 的解. 接著看第 39 項目內容為 47, 表示 39 +8 後可套用 47 的解. 繼續查表可得: 31 39 (+8) 47 (+8) 34 (-13) 21 (-13)
2009/12/5 21:18
|
||||||||||
![]() |