登录社区云,与社区用户共同成长
邀请您加入社区
深度优先搜索简单来说就是一条路走到黑。拿二叉树的前序遍历举例,我们遍历时从根节点向子节点遍历,先遍历左子树,再遍历右子树。如图,我们会从编号为1的节点开始,遍历2,5,到达末尾时回溯到2,6,再回溯到1...简而言之,就是我们一头扎进去,撞了南墙,我就退一步,但是决不放弃,在原基础上做出局部的改变去尝试第二条路,直到所有的情况我都试了,实在没有其他情况了,那我就回到1,从头出发,再做选择,再一头扎
exit(1);// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树//若遍历到#,返回NULL,跳过该字符(*pi)++;//不是#,创建当前结点(*pi)++;//创建左子树//创建右子树// 二叉树前序遍历 -- 根左右return;// 二叉树中序遍历 -- 左根右return;// 二叉树后序遍历 -- 左右根return;// 层序遍历 -- 广度优先遍历Queue
给定一个不含重复数字的数组nums,返回其所有可能的全排列。按照任意顺序返回答案1 2 3// 存储输入的原始数组(从命令行读入)int n = 0;// 记录数组实际长度// 当前构造的排列// 标记某个数字是否被用过(值为true表示已用)// 深度优先搜索函数:递归构造排列// 终止条件:当前已经放了n个数字,排列完成i < n;return;// 枚举当前这一层可以选择的每个数字i < n
【代码】金额查错---1.dfs来模拟过程,记忆化无法剪枝 2.set来记录情况 3.巧妙return俩更新。
if(x>n){cnt++;i<=n;i++){cout<<endl;i<=n;i++){if(!a[i]&&!b[i-x+n]&&!c[i+x]){d[x]=i;a[i]=1;b[i-x+n]=1;c[i+x]=1;dfs(x+1);a[i]=0;d[x]=0;b[i-x+n]=0;c[i+x]=0;cin>>n;dfs(1);cout<<cnt;return 0;
这是一种算法:目的就是不到最深处不撞南墙不回头,我们惊奇的发现这种思路和递归的运行顺序是一致的,因此想实现这个算法,我们可以借助递归。注意点二:函数什么时候会返回,一个是代码运行结束的时候会返回。我们调用一个函数,函数结束后会回到调用这个函数的下一句代码。一个是代码运行遇到return语句的时候会返回。我们可以对每一位进行深度优先遍历。
int max=0;i<=n;i++){i<=n;i++){max:len;int len=1;while(!len++;if(len>n){return -1;return len;elsereturn 0;
i++) {//遍历其它点return;//从起点开始遍历。return res;
用数组标记一个状态是否被搜索过,搜索过则直接 return,不用再执行函数,用于保证每个状态只被搜索一次。,通过判断 x 是否被搜索过,搜索过则直接return结束函数,将 vis[x] 赋值为 true,表示当前搜索到 x 了,之后不用再重复搜索需要标记优化的情况:可能会重复搜索同一个状态,并且状态的表示要比较简单(用少数几个变量就能表示一个状态)。状态用一个变量表示,就用一维数组标记,状态用两
a[x][y]=0;dfs(x-1,y);dfs(x+1,y);dfs(x,y+1);dfs(x,y-1);int main()i<=n;i++){j<=m;j++){i<=n;i++){j<=m;j++){if(a[i][j]!=0){ans++;dfs(i,j);return 0;