2008-12-17 49 views
0

我對Bejeweled遊戲提出的編程挑戰很感興趣。它看起來像一個簡單的遊戲,但程序化它看起來更復雜。數據庫寶石迷陣拼圖 - 這個解決方案如何工作?

在我尋找在董事會是如何評估的提示,我碰到this QUIZ穿上由簡單的通話好鄉親。他們已經發布了獲勝的答案,但如果我真的能夠理解該解決方案的工作原理,我就會受到挫敗。我可以看到它與矩陣有關,並將單元格值與它們的行和列組合在一起,但就目前爲止我已經得到了。任何人都可以爲我分解一點嗎?

POSTED SOLUTION(測驗的細節在上面的鏈接):

--====== Table matches needs to be loaded only once 
CREATE TABLE matches(offsetRow1 INT, offsetCol1 INT, offsetRow2 INT, ofsetCol2 INT, directions VARCHAR(20)) 
-- for horizontal 
INSERT INTO matches VALUES(-1, -1, -1, -2, 'up') 
INSERT INTO matches VALUES(-1, -1, -1, 1, 'up') 
INSERT INTO matches VALUES(-1, 1, -1, 2, 'up')   
INSERT INTO matches VALUES(1, -1, 1, -2, 'down')   
INSERT INTO matches VALUES(1, -1, 1, 1, 'down') 
INSERT INTO matches VALUES(1, 1, 1, 2, 'down')  
INSERT INTO matches VALUES(0, -2, 0, -3, 'left')  
INSERT INTO matches VALUES(0, 2, 0, 3, 'right')    
-- for verical 
INSERT INTO matches VALUES(-2, -1, -1, -1, 'left') 
INSERT INTO matches VALUES(-1, -1, 1, -1, 'left') 
INSERT INTO matches VALUES(1, -1, 2, -1, 'left') 
INSERT INTO matches VALUES(-2, 1, -1, 1, 'right') 
INSERT INTO matches VALUES(-1, 1, 1, 1, 'right') 
INSERT INTO matches VALUES(1, 1, 2, 1, 'right') 
INSERT INTO matches VALUES(-2, 0, -3, 0, 'up') 
INSERT INTO matches VALUES(2, 0, 3, 0, 'down') 

--================================================== 
;WITH CTE 
     AS 
    (
    SELECT 
     [Row] = CAST([#] AS INT), 
     [Col] = CAST([Col] AS INT), 
     [Value] 
    FROM bejeweled 
     UNPIVOT ([Value] FOR [Col] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) unpvt 
) 
SELECT DISTINCT T.Row, T.Col, T.Value, directions 
    FROM CTE T 
     JOIN CTE T1 
     ON T.Value = T1.Value 
     JOIN CTE T2 
     ON T.Value = T2.Value 
     JOIN matches 
     ON (T1.Row - T.Row) = offsetRow1 
    AND (T1.Col - T.Col) = offsetCol1 
    AND (T2.Row - T.Row) = offsetRow2 
    AND (T2.Col - T.Col) = ofsetCol2 
    ORDER BY T.Row, T.Col 

回答

3

的逆轉置功能將原始數據轉化爲線性列表,而不是一個矩陣。例如,由於原始列中1,1的值爲8,所以新表的第一行爲1,1,8。同樣,由於原始表第一行的第二列是5,所以我們新表的第二行是1,2,5。

的「與CTE」有效地創建了一個名爲CTE在內存中的表,所以這種新的3列,81行的表稱爲CTE。

邏輯發生與內加入:在CTE每一個細胞獲取與本身其中值匹配接合到每一個細胞的CTE,其中這兩個值匹配,並再次。這意味着原始表格中的每個單元格都知道每個其他可能的三項匹配。即,返回包含值「1」(例如)的3個單元格的列表的每一個排列。

讓我們看看值2。有一個在(6,2),另外在(5,3),另一個在(7,3),所以內部的可能值的一個連接就個人有T .Row是6,T.Col是2,T1.Row是5,T1.Col是3,T2.Row是7,並且T2.Col是3.我們知道通過觀察交換(6,2)與(6,3)會把這三個連在一起。但JOIN語句如何知道?

那麼,一個有效的舉動是一個讓T IN T1和T2之間。確定3的組合是否通過檢查偏移量並將其與工作的相對位置列表進行比較來確定最簡單的方法。 T1在T(-1,1)的右上方,T2在T(1,1)的右下方。我們檢查並查看是否(-1,1,1,1)是有效匹配。它是,所以它通過了JOIN標準並保持結果。

+0

感謝您的幫助!你能詳細瞭解獲勝者是如何提出抵消的嗎? – 2008-12-17 19:54:39