1.题目
思路(Java语言描述)
经典的DFS+回溯算法,这题多的限制条件就是需要计算二维数组中 0 的个数,加上这个条件判断即可
class Solution {
//0 1
//2 0
int rowLen;
int colLen;
int totalCnt = 0;
public int uniquePathsIII(int[][] grid) {
rowLen = grid.length;
colLen = grid[0].length;
int zeroNum = getZeroNum(grid);
for(int i = 0;i<rowLen;i++){
for(int j = 0;j<colLen;j++){
if(grid[i][j] == 1){
dfs(i,j,grid,0,zeroNum);
break;
}
}
}
return totalCnt;
}
public void dfs(int i,int j,int[][] grid,int temp,int zeroNum){
if(!checkBoard(i,j) || grid[i][j] == -1){
return;
}
if(temp!=zeroNum+1 && grid[i][j] == 2){
return;
}
if(temp == zeroNum+1 && grid[i][j] == 2){
totalCnt++;
return;
}
grid[i][j] = -1;
dfs(i-1,j,grid,temp+1,zeroNum);
dfs(i,j+1,grid,temp+1,zeroNum);
dfs(i+1,j,grid,temp+1,zeroNum);
dfs(i,j-1,grid,temp+1,zeroNum);
grid[i][j] = 0;
}
public int getZeroNum(int[][] grid){
int cnt = 0;
for(int i = 0;i<rowLen;i++){
for(int j = 0;j<colLen;j++){
if(grid[i][j] == 0){
cnt++;
}
}
}
return cnt;
}
public boolean checkBoard(int i,int j){
if(i>=rowLen || i<0) return false;
if(j>=colLen || j<0) return false;
return true;
}
}
总结
这题第一遍写完之后,测试结果一直是0,思考了很久,发现是判断条件除了问题,深搜步数(temp)应该等于 zeroNum+1 而不是 zeroNum