• 1.排列数字 DFS


     

     

     DFS需要考虑搜索顺序

    这道题的搜索顺序是:

    假定一开始有n个空位了

    然后从左往右,从第一位开始填

    每一次填的时候,要填的数字不能和前面一样

     回溯时要记得恢复现场

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 10;
     4 int ans[N]; //答案
     5 bool vis[N]; //vis[i]等于true时,表示i这个数被用过了
     6 int n;
     7 void dfs(int u) {
     8     if (u == n) { //所有位置都搜完了
     9         for (int i = 0; i < n; i++) { //输出
    10             cout << ans[i] << " ";
    11         }
    12         cout << endl;
    13         return;
    14     }
    15     for (int i = 0; i < n; i++) { //枚举当前位置可以填哪个数
    16         if (!vis[i]) { //如果这个数没有被用到
    17             ans[u] = i + 1; //把这个数放在当前这个位置上
    18             vis[i] = true; //标记这个数已经被用过了
    19             dfs(u + 1); //递归到下一层
    20             //然后当上面这个dfs结束的时候,就意味着已经把上面这条路全部走完了
    21             //下面两行是回溯和恢复现场,恢复成原样
    22             ans[u] = 0;
    23             vis[i] = false;
    24         }
    25     }
    26 }
    27 int main() {
    28     cin >> n;
    29     dfs(0); //从第0个位置开始看
    30     return 0;
    31 }
  • 相关阅读:
    java exception
    【洛谷P1627】 【CQOI2009】中位数
    切蛋糕
    【NOIP2015Day2T2】【洛谷P2679】子串
    【NOIP2017Day1T3】【洛谷P3953】逛公园
    【bzoj1082】【SCOI2005】栅栏
    搬砖
    花花的森林
    跳跳棋
    异或
  • 原文地址:https://www.cnblogs.com/fx1998/p/13306488.html
Copyright © 2020-2023  润新知