深度优先遍历
常用步骤如下
排列问题
使用一个q[]数组保存排列的方案
bool st[] 用来判断这种方案是否合法。
1、dfs(int u) u代表搜索的第几位。
2、if() 结束判断的条件
3、枚举所有可能的情况,一般是使用for循环
for(int i=1;i<=3;i++)
if(st[i]) continue
st[i] = true;
4、如果合法则需要将其标记访问过防止重复访问,调用递归dfs(u+1)
5、恢复现场,恢复调用递归之前的条件即将访问st[i]=false;
地图搜索有多少种路径问题
int x[0,0,-1,1]
int y[1,-1,0,0]
上述数组表示上下左右
int view[][]表示是否已经访问
dfs(int x,int y);
由于与坐标有关所以传入坐标。
1、结束条件当走到指定坐标时结束。
2、枚举所有可能情况
即在某一点,它可以上下左右的走,即有4种情况
3、判断该种情况是否合法,是否超过边界,然后标记以访问,递归到下一点
4、恢复现场
注意需要将起点首先标记为已经访问过
关于n皇后问题
首先
bool col[]
bool g[2n] ug[2n]因为有两倍对角线数
dfs(int n)
表示棋子放在第几行,我们默认一个棋子放一行
结束条件为所有棋子都已经放完了
枚举所有情况,就是在当前行的所有位置放一遍。
判断条件如果在对角线或者在同一行。同对角线只需将x+y轴相加即可,反对角线就是将y-x+n防止出现负数,都加都减没有影响。 x+y和为常量。
递归该位置。