756-Pyramid Transition Matrix

kevin聰發表於2018-04-24

Description

We are stacking blocks to form a pyramid. Each block has a color which is a one letter string, like 'Z'.

For every block of color C we place not in the bottom row, we are placing it on top of a left block of color A and right block of color B. We are allowed to place the block there only if (A, B, C) is an allowed triple.

We start with a bottom row of bottom, represented as a single string. We also start with a list of allowed triples allowed. Each allowed triple is represented as a string of length 3.

Return true if we can build the pyramid all the way to the top, otherwise false.


Example 1:

Input: bottom = "XYZ", allowed = ["XYD", "YZE", "DEA", "FFF"]
Output: true
Explanation:
We can stack the pyramid like this:
    A
   / \
  D   E
 / \ / \
X   Y   Z

This works because ('X', 'Y', 'D'), ('Y', 'Z', 'E'), and ('D', 'E', 'A') are allowed triples.

Example 2:

Input: bottom = "XXYX", allowed = ["XXX", "XXY", "XYX", "XYY", "YXZ"]
Output: false
Explanation:
We can't stack the pyramid to the top.
Note that there could be allowed triples (A, B, C) and (A, B, D) with C != D.

Note:

  1. bottom will be a string with length in range [2, 8].
  2. allowed will have length in range [0, 200].
  3. Letters in all strings will be chosen from the set {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’}.

問題描述

用磚塊堆金字塔。每個磚塊由一個單個字母的字串表示, 如”Z”

三元組(A, B, C)為允許的堆磚方式, 表示C的左下方為A, 右下方為B

最底層bottom由一個字串表示, 我們通過一系列的三元組來堆金字塔

如果可以堆到最頂層, 返回true, 否則返回false


問題分析

回溯法


解法(回溯法)

public class Solution {
    int[][] T;

    public boolean pyramidTransition(String bottom, List<String> allowed) {
        T = new int[7][7];
        for (String a: allowed) T[a.charAt(0) - 'A'][a.charAt(1) - 'A'] |= 1 << (a.charAt(2) - 'A');

        int N = bottom.length();
        int[][] A = new int[N][N];
        int t = 0;
        for(char c: bottom.toCharArray())  A[N - 1][t++] = c - 'A';

        return solve(A, N - 1, 0);
    }

    //A[i] - the ith row of the pyramid
    //N - length of current row we are calculating
    //i - index of how far in the current row we are calculating
    //Returns true iff pyramid can be built
    public boolean solve(int[][] A, int N, int i) {
        if(N == 1 && i == 1){ // If successfully placed entire pyramid
            return true;
        }else if (i == N){
            return solve(A, N - 1, 0); 
        }else{
            // w's jth bit is true iff block #j could be
            // a parent of A[N][i] and A[N][i+1]
            int w = T[A[N][i]][A[N][i + 1]];
            // for each set bit in w...
            for(int b = 0; b < 7; ++b){
                if(((w >> b) & 1) != 0){
                    //set parent to be equal to block #b
                    A[N - 1][i] = b; 
                    //If rest of pyramid can be built, return true
                    if(solve(A, N, i + 1)) return true;
                }
            }
            return false;
        }
    }
}

相關文章