Sql 数据库宝石之谜-此解决方案如何工作?

Sql 数据库宝石之谜-此解决方案如何工作?,sql,database,matrix,Sql,Database,Matrix,我对游戏Bejewelled带来的编程挑战感兴趣。这看起来像是一个简单的游戏,但从编程的角度来说,它看起来更复杂 在我寻找有关如何评估董事会的提示时,我在《简单交谈》中遇到了好人的建议。他们已经发布了获胜的答案,但如果我真的能摸索出解决方案是如何工作的,我会感到沮丧。我可以看出,这与矩阵和将单元格值与其行和列一起分组有关,但这是我迄今为止所做的。有人能帮我把它再细分一点吗 已发布解决方案(测验详情见上面的链接): unpivot函数将原始数据转换为线性列表,而不是矩阵。例如,由于原始列中1,1处

我对游戏Bejewelled带来的编程挑战感兴趣。这看起来像是一个简单的游戏,但从编程的角度来说,它看起来更复杂

在我寻找有关如何评估董事会的提示时,我在《简单交谈》中遇到了好人的建议。他们已经发布了获胜的答案,但如果我真的能摸索出解决方案是如何工作的,我会感到沮丧。我可以看出,这与矩阵和将单元格值与其行和列一起分组有关,但这是我迄今为止所做的。有人能帮我把它再细分一点吗

已发布解决方案(测验详情见上面的链接):


unpivot函数将原始数据转换为线性列表,而不是矩阵。例如,由于原始列中1,1处的值为8,因此新表的第一行为1,1,8。同样,由于原始表第一行的第二列是5,因此新表的第二行是1,2,5

“With CTE”有效地创建了一个名为CTE的内存表,因此这个新的3列81行表称为CTE

逻辑发生在内部连接上:CTE中的每个单元都连接到值匹配的CTE中的每个单元,再次连接到值匹配的自身。这意味着原始表中的每个单元格都知道其他可能的三项匹配。也就是说,返回包含值“1”(例如)的3个单元格列表的每个排列

让我们看看值2。在(6,2)处有一个,在(5,3)处有一个,在(7,3)处有另一个,因此内部联接的一个可能值将使T.行为6,T.列为2,T1.行为5,T1.列为3,T2.行为7,T2.列为3。通过观察,我们知道用(6,3)替换(6,2)会使三个元素排成一行。但是JOIN语句怎么知道呢


一个有效的移动是把T放在T1和T2之间。确定3的组合是否满足的最简单方法是检查偏移量并将其与工作的相对位置列表进行比较。T1位于T(-1,1)的上方和右侧,T2位于T(1,1)的下方和右侧。我们检查(-1,1,1,1)是否为有效匹配项。是的,因此它通过了连接条件,并作为结果保留。

unpivot函数将原始数据转换为线性列表,而不是矩阵。例如,由于原始列中1,1处的值为8,因此新表的第一行为1,1,8。同样,由于原始表第一行的第二列是5,因此新表的第二行是1,2,5

“With CTE”有效地创建了一个名为CTE的内存表,因此这个新的3列81行表称为CTE

逻辑发生在内部连接上:CTE中的每个单元都连接到值匹配的CTE中的每个单元,再次连接到值匹配的自身。这意味着原始表中的每个单元格都知道其他可能的三项匹配。也就是说,返回包含值“1”(例如)的3个单元格列表的每个排列

让我们看看值2。在(6,2)处有一个,在(5,3)处有一个,在(7,3)处有另一个,因此内部联接的一个可能值将使T.行为6,T.列为2,T1.行为5,T1.列为3,T2.行为7,T2.列为3。通过观察,我们知道用(6,3)替换(6,2)会使三个元素排成一行。但是JOIN语句怎么知道呢


一个有效的移动是把T放在T1和T2之间。确定3的组合是否满足的最简单方法是检查偏移量并将其与工作的相对位置列表进行比较。T1位于T(-1,1)的上方和右侧,T2位于T(1,1)的下方和右侧。我们检查(-1,1,1,1)是否为有效匹配项。是的,因此它通过了加入条件,因此被保留。

感谢您的帮助!你能更详细地介绍一下获胜者是如何得到补偿的吗?谢谢你的帮助!你能更详细地谈谈获胜者是如何得出补偿的吗?
--====== 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