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:
- bottom will be a string with length in range [2, 8].
- allowed will have length in range [0, 200].
- 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;
}
}
}