在对dfs的搜索框架进行debug的时候,发现每次出现的错误总是很类似的,这里对其进行整理一下。
总体思想:
dfs的时候,已进入函数体,有2种情况:
1 一种是当前已经包含了当前搜索的点,这个时候不需要在函数内部进行标记,只要在遍历的时候进行标记即可。
2 另外一种情况是当前还没有访问当前搜索的点,那么这个时候就要先判断是否越界,然后访问当前的点,并且进行标记,然后再进行结果剪枝, 再进行搜索。
比如剑指offer 12
这里的第一种写法是
第1种写法
在dfs访问的时候不进行标记,那么dfs访问之前必须标记好
bool dfs(board,mark,word,curstep,currow,curcol){
if(越界)return false;
if(board[currow,curcol]!=word[step]){
return false;//将要收入的点不符合,那么直接不通过
}
//此处相当于收入节点,并且进行判断
if(curstep+1==word.size){
return true;//已经搜索到了结尾
}
bool ans=false;
for(对周围的点进行搜索){
newrow,newcol;
if(没有搜索过,并且没有越界){
mark[newrow,newcol]=1;
ans=dfs(curstep+1);
mark[newrow,newcol]=0;
}
}
return ans;
}
bool fun(){
for(对每行){
for(对每列){
mark[row,col]=1;//在进入之前要进行标记
dfs(row,col)=0;
mark[row,col]=0;
}
}
return ans;
}
第2种写法
在dfs访问的时候进行标记,那么dfs访问的结尾要擦去标记
bool dfs(board,mark,word,curstep,currow,curcol){
if(越界)return false;
if(board[currow,curcol]!=word[step]){
return false;//将要收入的点不符合,那么直接不通过
}
//此处相当于收入节点,并且进行判断
if(curstep+1==word.size){
return true;//已经搜索到了结尾
}
//下面一行注意
mark[currow,curcol]=1;//这里进行标记!!!!
bool ans=false;
for(对周围的点进行搜索){
newrow,newcol;
if(没有搜索过,并且没有越界){
mark[newrow,newcol]=1;
ans=dfs(curstep+1);
mark[newrow,newcol]=0;
}
}
mark[currow,curcol]=0;//这里要擦去标记!!!
return ans;
}
bool fun(){
for(对每行){
for(对每列){
//在进入之前不再需要进行标记
dfs(row,col)=0;
}
}
return ans;
}