深度优先搜索入门

数字的全排列

跳转链接

深度优先搜索就是先走到底走到无路可走然后再进行回溯的算法,用于全排列打表操作,数字的全排列操作就是每一个序列需要包含从1到n所有的数字,但是数字不能重复,不能和原来有过的序列相同

思路:开一个bool数组用于记录当前下标的数字是否被使用过,同时开一个path数组用记录已经生成了的序列,便于输出,dfs函数的u是记录当前已经走过的步数,当步数等于n时表明已经走到了尽头需要进行回溯,在回溯前需要将已经保存在path数组的序列进行输出,每个输出后要换行,所以加了一个put。然后在没有达到最后一步时,对st数组进行遍历,如果有没有使用的数字就将其加到当前的path[u]中,然后将其变成true再送给下一层进行递归,再递归结束后恢复现场,让其变成false,因为path[u]赋值会覆盖上一次的值,所以path数组不用管。

代码如下

#include <iostream>
using namespace std;
const int N = 10;
int path[N];
bool st[N];
int n;
void dfs(int u)
{
  if (u == n) 
  {
    for (int i = 0; i < n; i ++) printf("%d ", path[i]);
    puts("");
    return;
  }
  for (int i = 1; i <= n; i ++)
  {
    if (!st[i])
    {
      path[u] = i;
      st[i] = true;
      dfs(u + 1);
      st[i] = false;
    }
  }
}
int main()
{
  cin >> n;
  dfs(0);
  return 0;
}
posted @ 2022-07-11 10:09  LYL233  阅读(61)  评论(0)    收藏  举报