基本概念
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。
搜索思想
深搜的思想就是一搜到底,而且已经搜索过的路径标记下来,不会重复搜索,如果一条路径的搜索不动了,那就退回,换一条路径搜索,知道所有的情况都搜索完。
基本模板
void dfs(int step) { 判断边界 尝试每一种可能 for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 }
搜索过程
深搜的思想就是一搜到底,如果搜索不动了,就退回换一条路径继续搜索,下面来看一个例子的搜索路径
例子的起始位置的(0,0),在一个九宫格内进行搜索。
#include<iostream> using namespace std; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int book[3][3]={0}; int next[4][2]={0,1,1,0,0,-1,-1,0};//搜索顺序右下左上 int sum=0; void dfs(int x,int y,int step,string s) { if(step==9) { sum++; cout<<"第"<<sum<<"条搜索路径"<<s<<endl;; return ; } for(int i=0;i<4;i++) { int tx=x+next[i][0]; int ty=y+next[i][1]; if(tx<0||tx>=3||ty<0||ty>=3) continue; if(book[tx][ty]==1) continue; book[tx][ty]=1; dfs(tx,ty,step+1,s+"->"+char('0'+a[tx][ty])); book[tx][ty]=0; } } int main() { book[0][0]=1; dfs(0,0,1,"1"); cout<<"一共"<<sum<<"条搜索路径"<<endl; return 1; }
运行结果:
来源:CSDN
作者:一心只学编程
链接:https://blog.csdn.net/weixin_44820625/article/details/104579743