下定义
DFS指:从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。
写DFS函数的关键
1.考虑选择什么样的状态;
2.弄清第i个状态(即每一个状态)要干什么。
技巧
画搜索树
题目分类
一.对于状态少,但每个状态的情况极多的题目:
用dfs代替n重循环。如:(9条消息) DFS代替n重循环---洛谷P1149 火柴棒等式_IOv0id的博客-优快云博客
二.对于有明显起点的题目,可以联想图的形式进行DFS;
三.对于起点不明显的题目,可以将题目中的状态分步或者说分类,以实现不同分支继续进行DFS;
这种状态需要自行判断找出,一般要找状态数目少的,这样的话,每一次dfs中函数调用的次数就少。比如洛谷P3392 涂国旗P3392 涂国旗 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),
题目要求一个坐标系中每一行涂一种颜色,共给出三种颜色,且三种颜色顺序必须是白,蓝,红;该题的状态可以是
1.判断每一行可以涂多少种颜色(如果看成是涂数字,也可以用dfs代替n重循环解决问题)
2.前i行涂白色,再涂j行蓝色,剩余的行涂红色。初始值i,j可以均设置为1,以i,j为dfs参数,每次调用时i+1或j+1.
显然第二种状态只用两步调用,而第一种状态需要用多个条件语句调用很多次。
所以该题选择第二种分步更合适.
四.当需要回溯时
先分步调用函数.
在每一步(即每次调用)前就要完成这一步需要执行的动作;
在这一步结束后,再完成下一步需要执行的动作,而这个动作就包括撤回之前一步的动作。
例题:洛谷P1157 组合的输出(9条消息) 洛谷P1157 组合的输出_IOv0id的博客-优快云博客