关于9-9,记忆化搜索
来源:9-10 记忆化搜索
martin123_
2019-09-22
老师您好!关于9-9实现leetcode上980号问题,事实上我自己写了一份代码,也通过了测试,但是对于我这套代码的记忆化搜索写法,我并不是很清楚,也不确定能否在不改变代码结构和dfs函数返回值的基础上实现记忆化搜索,想请您帮忙看看;
具体思路是这样的:与您的写法只有一点不同,就是dfs没有返回值,而我另外选择一个全局变量cnt计数路径数目
//leetcode 980
class Solution1 {
private int[][] grid;
private int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
private int R, C;
private int sour = -1, dest = -1;//起点坐标和终点坐标,将二维映射到一维后的结果
private int numOfZero = 0;
private int cnt = 0;//记录哈密尔顿路径数目的变量
public int uniquePathsIII(int[][] grid) {
this.grid = grid;
R = grid.length;
C = grid[0].length;
for(int i = 0; i < R; i ++)
for(int j = 0; j < C; j ++) {
if (grid[i][j] == 1)
sour = i*C + j;
else if (grid[i][j] == 2)
dest = i*C + j;
if(grid[i][j] != -1)
numOfZero ++;
}
if(sour == -1 || dest == -1) return 0;
int visited = 0;
dfs(visited, sour / C, sour % C, numOfZero);//一张图的结点个数固定,哈密尔顿路径需遍历所有节点
return cnt;
}
private void dfs(int visited, int x, int y, int left){//left变量记录剩余的应遍历的结点数
visited += (1 << (x*C+y));
left --;
if(left == 0 && x*C + y == dest)
cnt++;//找到一条路径
else {
for (int d = 0; d < 4; d++) {//遍历v的所有邻点
int netx = x + dirs[d][0], nety = y + dirs[d][1];
int next = netx*C + nety;
if (inArea(netx, nety) && (visited & (1<<next)) == 0 && grid[netx][nety] != -1)
dfs(visited, netx, nety, left);
}
}
}
private boolean inArea(int x, int y){return x >= 0 && x < R && y >= 0 && y < C;}
}
对于我这个dfs的写法,没有返回任何类型,所以递归函数语义可能相对比较模糊;没有记录每个(visited, v)数值对可以到达终点的路径数目,所以感觉上应该不能使用 "int[][]"型数组来存储这个历史;那么能否使用别的方法来实现这个代码上的记忆化搜索呢?
写回答
1回答
-
liuyubobobo
2019-09-22
我可能没有特别理解你的问题。你的这个代码并不是记忆化搜索,就是回溯法:)
继续加油!:)
042019-09-22
相似问题