756-Pyramid Transition Matrix

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值