2017-03-20 8 views
0

수수께끼를 풀려고하는 Im, 레벨 48에 도달하는 약간의 교활하고 무차별 한 힘을 사용합니다.하지만 이제는 계산을 재사용하기 위해 메모를 사용합니다.어떻게 모든 조각 조합을 만들 수 있습니까?

+-----------+-----------+-------------+-------------+-------------+-------------+-------------+ 
| puzzle_id | piece_id | flips_row1 | flips_row2 | flips_row3 | flips_row4 | flips_row5 | 
+-----------+-----------+-------------+-------------+-------------+-------------+-------------+ 
|   1 |   1 |   2 |   1 |   2 |   0 |   0 | 
|   1 |   2 |   2 |   1 |   0 |   0 |   0 | 
|   1 |   3 |   2 |   2 |   2 |   0 |   0 | 
|   1 |   4 |   3 |   1 |   3 |   0 |   0 | 
|   1 |   5 |   4 |   3 |   3 |   3 |   0 | 
|   1 |   6 |   3 |   0 |   0 |   0 |   0 | 
|   1 |   7 |   3 |   1 |   3 |   0 |   0 | 
|   1 |   8 |   3 |   4 |   1 |   2 |   2 | 
|   1 |   9 |   1 |   0 |   0 |   0 |   0 | 
|   1 |  10 |   2 |   2 |   2 |   0 |   0 | 
|   1 |  11 |   2 |   3 |   4 |   0 |   0 | 
|   1 |  12 |   1 |   3 |   1 |   3 |   2 | 
|   1 |  13 |   1 |   2 |   2 |   0 |   0 | 
|   1 |  14 |   2 |   4 |   1 |   1 |   0 | 
|   1 |  15 |   1 |   2 |   1 |   0 |   0 | 
|   1 |  16 |   1 |   1 |   3 |   0 |   0 | 
|   1 |  17 |   3 |   2 |   3 |   1 |   0 | 
|   1 |  18 |   1 |   3 |   2 |   2 |   0 | 
+-----------+-----------+-------------+-------------+-------------+-------------+-------------+ 

내가 모든 조각의 조합으로 테이블 solution_pieces을 채우기 위해 도움이 필요 :이 수준

puzzles: (puzzle_id, level, flips) 
CONSTRAINT puzzle_id_pk PRIMARY KEY (puzzle_id) 

puzzle_rows (puzzle_id, row_id, row_flips) 
CONSTRAINT puzzle_row_pk PRIMARY KEY (puzzle_id, row_id), 
CONSTRAINT puzzle_row_puzzle_id_fk FOREIGN KEY (puzzle_id) 

pieces: (puzzle_id, piece_id, flips_row1, flips_row2, flips_row3, flips_row4, flips_row5) 
CONSTRAINT piece_id_pk PRIMARY KEY (puzzle_id, piece_id), 
CONSTRAINT piece_puzzle_id_fk FOREIGN KEY (puzzle_id) 

18 개 있습니다

나는 일부 테이블이있다. 이 경우는 2^18 = 262144입니다. 아이디어는 행 패리티를 먼저 확인하여 검색 공간을 정리하는 것입니다. (SUM(pieces.flips_row1) + puzzle_row[1].flips) % 3 = 0. 첫 번째 행에 조각 {14,15}와 아래 그림에서 예를 들어

는 :

solutions: (solution_id, puzzle_id, 
      flips_row1, flips_row2, flips_row3, flips_row4, flips_row5) 
CONSTRAINT solution_pk PRIMARY KEY (solution_id), 
CONSTRAINT solution_puzzle_id_fk FOREIGN KEY (puzzle_id) 

solution_pieces: (solution_id, piece_id) 
CONSTRAINT solution_pieces_pk PRIMARY KEY (solution_id, piece_id), 
CONSTRAINT solution_pieces_solution_id_fk FOREIGN KEY (solution_id) 
CONSTRAINT solution_puzzle_id_fk FOREIGN KEY (puzzle_id) 

pieces total flips (3) + row_flips (3) = 6 % 3 = 0 그래서 나는 다음과 같은 테이블 solution_pieces를 입력해야합니다.

solution_id piece_id 
    1    1 
    ....     -- solutions with only one piece 
    18   18 

    19   1 
    19   2 
    20   1 
    20   3 
    ....     -- solutions with two pieces 
    262144  {1..18} -- solution with all pieces 

은 다음 표 solutions은 행 배열을 변환 unnest 추가, 단지 GROUP BY

enter image description here

답변

0

Erwin Brandstetter 솔루션을 사용하여 채우기됩니다.

WITH cte as (
    SELECT row_number() over() as rn, * 
    FROM f_combos(array(SELECT piece_id FROM pieces ORDER BY piece_id)) 
) 
SELECT rn, unnest(f_combos) AS id 
FROM cte  
ORDER BY 1;