class Solution {
public int colorTheGrid(int m, int n) {
// 每一列可能的状态总数 每个单元有3可能
int totalState = 1;
for (int i = 0; i < m; ++i) totalState *= 3;
// prek 代表前一轮dp 状态为k 的方案总数
int \[\] pre = new int totalState;
// 初始化合法填色 的 方案数为1
for (int state = 0; state < totalState; ++state) {
if (checkCol(state, m)) prestate = 1;
}
for (int i = 1; i < n; ++i) {
int \[\] cur = new int totalState;
// 枚举可能的转移
for (int preState = 0; preState < totalState; ++preState) {
if (prepreState == 0) continue;
for (int curState = 0; curState < totalState; ++curState) {
// 行和列的填色都满足题设
if (checkCol(curState, m) && checkRow(preState, curState, m)) {
curcurState = addWithMode(curcurState, prepreState);
}
}
}
pre = cur;
}
int planNum = 0;
for (int state = 0; state < totalState; ++state) {
planNum = addWithMode(planNum, prestate);
}
return planNum;
}
private boolean checkCol(int state, int m) {
int prevCeilColor = -1;
while (m-- > 0) {
if (state % 3 == prevCeilColor) {
return false;
}
prevCeilColor = state % 3;
state /= 3;
}
return true;
}
private boolean checkRow(int pre, int cur, int m) {
while (m-- > 0) {
if (pre % 3 == cur % 3) return false;
pre /= 3;
cur /= 3;
}
return true;
}
private int addWithMode(int a, int b) {
int mode = (int) 1E9 + 7;
return (a + b) % mode;
}
}