承接上一篇学习笔记(BFS最优问题求解实例)我再给大家看看如果用DFS求解这个问题的代码,比BFS复杂很多
在使用DFS时,我遇到的困难有:
Difficult
1.为了防止死循环,所以 当Ignatius走到一个Bomb-Reset-Equipment上时,这个结点的子辈结点都不能再使用这个Bomb-Reset-Equipment,而这个结点的兄弟结点和父辈结点的兄弟结点仍可以使用,所以在递归和回溯时要把控制Bomb-Reset-Equipment是否可用的变量修改(reset[i][j]–/reset[i][j]++,当reset[i][j]=1时maze[i][j]的Bomb-Reset-Equipment才可用);而BFS中只要有一个结点访问过Bomb-Reset-Equipment就可把这个Bomb-Reset-Equipment视为EMPTY
2.如果要进行剪枝,DFS比较困难,需要再定义一个vis地图保存访问记录,当Ignatius走到Bomb-Reset-Equipment上时还要允许Ignatius可以回退两步(BACK),不仅情况复杂,而且占用内存空间比较大;而BFS如果要剪枝的话只需要保存其父结点(之后我会给出带剪枝的BFS和DFS的code),当Ignatius走到Bomb-Reset-Equipment上时只要把此结点的父结点指向自己即可
3.查找次数过多
case1:
2 1 1
1 1 0
1 1 3
case2:
2 1 1 0 1 1 1 0
1 0 4 1 1 0 4 1
1 0 0 0 0 0 0 1
1 1 1 4 1 1 1 3
case3:
1 2 1 1 1 1 1 4
1 0 0 0 1 0 0 1
1 4 1 0 1 1 0 1
1 0 0 0 0 3 0 1
1 1 4 1 1 1 1 1
—- | Case1 | Case2 | Case3 |
BFS |—– 34 |—-119 |— 164 |
DFS |—– 36 |—-989 |— 564 |
My AC Code
|
|