/*
* 2*M铺地的问题非常简单,这个是解决N*M铺地的问题
*/
public static int ways1(int N, int M) {
if (N < 1 || M < 1 || ((N * M) & 1) != 0) {
return 0;
}
if (N == 1 || M == 1) {
return 1;
}
int[] pre = new int[M]; // pre代表-1行的状况
for (int i = 0; i < pre.length; i++) {
pre[i] = 1;
}
return process(pre, 0, N);
}
// pre 表示level-1行的状态
// level表示,正在level行做决定
// N 表示一共有多少行 固定的
// level-2行及其之上所有行,都摆满砖了
// level做决定,让所有区域都满,方法数返回s
public static int process(int[] pre, int level, int N) {
if (level == N) { // base case
for (int i = 0; i < pre.length; i++) {
if (pre[i] == 0) {
return 0;
}
}
return 1;
}
// 没到终止行,可以选择在当前的level行摆瓷砖
int[] op = getOp(pre);
return dfs(op, 0, level, N);
}
// op[i] == 0 可以考虑摆砖
// op[i] == 1 只能竖着向上
public static int dfs(int[] op, int col, int level, int N) {
// 在列上自由发挥,玩深度优先遍历,当col来到终止列,i行的决定做完了
// 轮到i+1行,做决定
if (col == op.length) {
return process(op, level + 1, N);
}
int ans = 0;
// col位置不横摆
ans += dfs(op, col + 1, level, N); // col位置上不摆横转
// col位置横摆, 向右
if (col + 1 < op.length && op[col] == 0 && op[col + 1] == 0) {
op[col] = 1;
op[col + 1] = 1;
ans += dfs(op, col + 2, level, N);
op[col] = 0;
op[col + 1] = 0;
}
return ans;
}
public static int[] getOp(int[] pre) {
int[] cur = new int[pre.length];
for (int i = 0; i < pre.length; i++) {
cur[i] = pre[i] ^ 1;
}
return cur;
}
2021-10-31(TPS问题变型)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 邀请大家读父母规100天,每天读一遍。读给自己内心听! 父母规 1)从此刻起: 我要多鼓励、赞美孩子, 而不是批评...
- 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...
- 一、jQuery简介 JQ是JS的一个优秀的库,大型开发必备。在此,我想说的是,JQ里面很多函数使用和JS类似,所...