四人過橋問題的SQL解法
看了開發版的帖子,又沒有忍住,簡單寫了一個SQL語句。關於問題的詳細描述可以參考http://www.itpub.net/thread-1595264-1-1.html
傳說中的微軟面試題:
有一群人A,B,C,D (人數>=2)要在夜裡走過獨木橋過河,他們只有一把手電筒。四個人的速度不同,過河分別需要1,2,5,10分鐘,橋上最多走兩個人,兩個人一起走時按速度慢的計算。過河一定要用手電筒。請問最快的方法是如何安排,需要幾分鐘?
例子輸出:
A B,A,A C,A,A D 19
直接給出最終結果:
SQL> WITH C AS
2
(SELECT NAME, TIME, POWER(2, ROWNUM - 1) POS FROM BRIDGE_CROSSING),
3
A AS
4
(SELECT 0 RN, A.NAME || ' ' || B.NAME NAME, GREATEST(A.TIME, B.TIME)
TIME, A.POS + B.POS POS
5
FROM C A, C B
6
WHERE A.NAME < B.NAME
7
UNION ALL
8
SELECT 1, NAME, TIME, POS FROM C),
9
B (RN, NAME, TIME, POS) AS
10
(SELECT 0 RN, CAST ('' AS VARCHAR2(4000)) NAME, 0, 0 POS FROM DUAL
11
UNION ALL
12
SELECT B.RN + 1,
13
B.NAME || ',' || A.NAME,
14
B.TIME + A.TIME,
15
DECODE(MOD(B.RN, 2), 0, B.POS + A.POS, B.POS - A.POS)
16
FROM B, A
17
WHERE MOD(B.RN, 2) = A.RN
18
AND DECODE(MOD(B.RN, 2), 0, BITAND(B.POS, A.POS), BITAND(B.POS - A.POS,
A.POS)) = 0)
19
SELECT LTRIM(NAME, ',') NAME, TIME FROM
20
(SELECT NAME, TIME, RANK() OVER(ORDER BY TIME) RN
21
FROM B
22
WHERE POS = POWER(2, 4) - 1)
23
WHERE RN = 1;
NAME TIME
------------------------------ ----------
A B,A,C D,B,A B 17
A B,B,C D,A,A B 17
簡單描述一下思路,透過構造一個POS列標識每個人的位置,比如1101表明ABD三個人都已經過橋了,如果POS的值達到15,則說明所有人都過橋。
這個遞迴WITH和以往的區別在於,兩個人一起過橋和一個人回來送手電的處理規則是不同的,甚至連線資料都是不同的。這裡採用將兩個人過橋和一個人回來作為不同的記錄插入到同一個表中,然後用不同的ID進行區別。隨後的遞迴呼叫,無論是查詢列,還是進行關聯的時候都要進行條件的判斷,判斷當前是兩個人過橋,還是一個人回來,從而進行不同的操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-721858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【藍橋杯】試題 歷屆試題 剪格子(python解法+java解法)PythonJava
- topK問題解法TopK
- RMQ問題的各種解法MQ
- JavaScript的two-sum問題解法JavaScript
- 八皇后問題python解法Python
- 關於橋模式的問題模式
- 10元買啤酒問題Java解法Java
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 藍橋杯-座次問題
- 藍橋杯-日期問題
- C#中漢諾塔問題的遞迴解法C#遞迴
- 那些年,我們處理過的SQL問題SQL
- 記錄一些常見問題的不同解法
- MySQL儲存過程中的sql_mode問題MySql儲存過程
- SQL在shared pool中的解析過程問題SQL
- 如何捕獲問題SQL解決過度CPU消耗問題 (zt)SQL
- 捕獲問題SQL解決過度CPU消耗問題-- 轉載SQL
- 通過 sysprocesses 解決Sql死鎖問題SQL
- 百人開燈問題解法及優化優化
- Logmnr獲取SQL長度超過4000的問題SQL
- Oracle透過AWR的SQL ordered by Gets和SQL ordered by Reads診斷問題OracleSQL
- 藍橋杯 2014屆真題 地宮取寶 動態規劃解法動態規劃
- 橋模式的疑問模式
- pl/sql的HomeEnd問題SQL
- 通過shell指令碼抓取awr報告中的問題sql指令碼SQL
- 透過shell指令碼抓取awr報告中的問題sql指令碼SQL
- SQL安裝過程式中的常問題和解決辦法SQL
- 跨鏈橋的存在解決了什麼問題?
- 四人團隊專案申請-----已通過
- Swift 首次除錯斷點慢的問題解法 | 優酷 Swift 實踐Swift除錯斷點
- 通過執行計劃中的CONCATENATION分析sql問題SQL
- 透過執行計劃中的CONCATENATION分析sql問題SQL
- Session的過期問題Session
- sql中的安全問題nullSQLNull
- sql server死鎖的問題SQLServer
- SQL "like" 運算子的問題SQL
- 大資料下的統計學:問題優先而非解法優先大資料
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode