756. 金字塔转换矩阵
题目链接:756. 金字塔转换矩阵
代码如下:
cpp
class Solution {
public:
bool pyramidTransition(string bottom, vector<string>& allowed) {
string groups[6][6]{};//三角形底部两个字母-》[三角形顶部字母]
for (auto& s : allowed) {
groups[s[0] - 'A'][s[1] - 'A'] += s[2];
}
int n = bottom.size();
vector<string> pyramid(n);
for (int i = 0;i < n;i++) {
pyramid[i].resize(i + 1);
}
pyramid[n - 1] = move(bottom);
//现在准备填[i,j]
//返回继续填能否填完所有格子(从下往上填,每行从左到右填)
auto dfs = [&](auto&& dfs, int i, int j)->bool {
if (i < 0) { //所有格子都已填完
return true;
}
if (j == i + 1) { //i行已填完
return dfs(dfs,i - 1, 0); //开始填i-1行
}
//枚举(i,j)填什么字母
//这取决于(i+1,j)和(i+1,j+1)填的字母
for (char top : groups[pyramid[i + 1][j] - 'A'][pyramid[i + 1][j + 1] - 'A']) {
pyramid[i][j] = top;
if (dfs(dfs,i, j + 1)) {
return true;
}
}
return false;
};
//倒数第二行开始填
return dfs(dfs, n - 2, 0);
}
};