LeetCode题解LCP 4. 覆盖

你有一块棋盘,棋盘上有一些格子已经坏掉了。你还有无穷块大小为1 * 2的多米诺骨牌,你想把这些骨牌不重叠地覆盖在完好的格子上,请找出你最多能在棋盘上放多少块骨牌?这些骨牌可以横着或者竖着放。

 

输入:n, m代表棋盘的大小;broken是一个b * 2的二维数组,其中每个元素代表棋盘上每一个坏掉的格子的位置。

输出:一个整数,代表最多能在棋盘上放的骨牌数。

 

示例 1:

输入:n = 2, m = 3, broken = [[1, 0], [1, 1]]

输出:2

解释:我们最多可以放两块骨牌:[[0, 0], [0, 1]]以及[[0, 2], [1, 2]]。(见下图)

 

LeetCode题解LCP 4. 覆盖

示例 2:

输入:n = 3, m = 3, broken = []

输出:4

解释:下图是其中一种可行的摆放方式

 

LeetCode题解LCP 4. 覆盖

限制:

1 <= n <= 8

1 <= m <= 8

0 <= b <= n * m

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/broken-board-dominoes

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:容易理解的回溯解法
```java
class Solution {

private int max = 0;
private int tmp = 0;
//使用回溯法把所有情况都列出来
public int domino(int n, int m, int[][] broken) {
//构建一个二维数组。data[][]。
//data[i][j] == 0:代表(i,j)位置可以放置牌
//data[i][j] == 1:代表(i,j)位置已经放置过了
//data[i][j] == -1:代表(i,j)位置坏掉了

int[][] data = new int[n][m];

for(int i = 0; i < broken.length; i++) {
int x = broken[i][0];
int y = broken[i][1];

data[x][y] = -1;
}

backtracing(data, 0, 0);
return max;

}

public void backtracing(int[][] data, int row, int col) {

int lx = data.length;
int ly = data[0].length;

//row超过index,回溯终止,计算max
if(row >= lx) {
max = Math.max(max, tmp);
return;
}

//col超过index,换行,继续回溯
if(col >= ly) {
backtracing(data, row+1, 0);
return;
}

//当前节点坏了或不能放置跳过该节点
if(data[row][col] == -1 || data[row][col] == 1) {
backtracing(data, row, col+1);
return;
}

//横着放
boolean h = false;
if(col + 1 < ly && data[row][col+1] == 0) {
h = true;
data[row][col] = 1;
data[row][col+1] = 1;
tmp++;
backtracing(data, row, col+2);
data[row][col] = 0;
data[row][col+1] = 0;
tmp--;
}

//竖着放
boolean v = false;
if(row + 1 < lx && data[row+1][col] == 0) {
v = true;
data[row][col] = 1;
data[row+1][col] = 1;
tmp++;
backtracing(data, row, col+1);
data[row][col] = 0;
data[row+1][col] = 0;
tmp--;
}

//横竖都不能放时,跳两格
if(!h && !v) {
backtracing(data, row, col+2);
}
}
}
```
LeetCode题解LCP 4. 覆盖

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

LeetCode题解圆上任取三点构成锐角三角形的概率

来自字节跳动的一道几何题题解:1/4

LeetCode题解深度优先遍历和回溯的关系?

深度优先遍历的范围更大还是回溯的范围更大?为什么?题解:我的理解是:dfs是回溯思想的一种体现- 回溯:是在整个搜索空间中搜索出可行解,在搜索过程中不断剪枝回退,这是回溯的思想,这个搜索空间并没有限制于特定的数据结构。- dfs:dfs是指特定的数据结构中如图,树(特殊的图)中搜索答案,范围限制在了特定的数据结构。个人拙见。

LeetCode题解盲人买袜子。

他们都各自买了两对黑袜和两对白袜,八对袜子的布质、大小完全相同,而每对袜子都有一张商标纸连着。两位盲人不小心将八对袜子混在一起。他们每人怎样才能取回黑袜和白袜各两对呢?题解:暴力破解, 把袜子都拆开 一人一只 哈哈