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:
- 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;
}
}
}
相關文章
- PlayMaker的Transition和Global Transition
- CSS transitionCSS
- transition & transformORM
- 【Vue】transition動畫Vue動畫
- react-transition-group原始碼淺析(一):Transition.mdReact原始碼
- Android Transition NoteAndroid
- CSS3 TransitionCSSS3
- 當transition遇上display
- Simple state transition 3
- Matrix Computations
- Matrix Distance
- 細談 vue - transition 篇Vue
- animation與transition 區別
- css3整理--transitionCSSS3
- Css3中的TransitionCSSS3
- animation、transition、transform的區別ORM
- CSS3 transition-delayCSSS3
- CSS3 transition-durationCSSS3
- CSS3 transition-propertyCSSS3
- CSS transition-timing-functionCSSFunction
- css transition 實現滑入滑出CSS
- CSS動畫:animation、transition、transform、translateCSS動畫ORM
- CSS3 transition 屬性CSSS3
- transition、transform、animate的區別?ORM
- css3 動畫(一) transitionCSSS3動畫
- CSS3——過渡(transition)CSSS3
- CSS3 Transition介紹CSSS3
- 初探Matrix Android ApkCheckerAndroidAPK
- webgl世界 matrix入門Web
- Leetcode Spiral MatrixLeetCode
- OpenGL Matrix Class (C++)C++
- D. Matrix Cascade
- 細談 vue - transition-group 篇Vue
- Vue 常用 transition 動畫效果記錄Vue動畫
- 照片牆(transform/transition/z-index)ORMIndex
- css transition屬性用法介紹CSS
- CSS3 之 transform & transition & animationCSSS3ORM
- transform,transition,animation的混合使用——初探ORM