zoukankan      html  css  js  c++  java
  • DFS

    DFS全排列:

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int N = 10;
    int n,path[N];
    bool sta[N];
    void dfs(int u)
    {
        if(u == n)
        {
            for(int i = 0;i<n;i++)
                cout<<path[i]<<" ";
            cout<<endl;
            return;
        }
        for(int i = 1;i<=n;i++)
        {
            if(!sta[i])
            {
                path[u] = i;
                sta[i] = 1;
                dfs(u+1);
                sta[i] = 0;
            }
        }
    }
    int main()
    {
        cin>>n;
        dfs(0);
    }

     n皇后问题:

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int N = 10;
    int n,tot;
    char g[N][N];
    bool col[N],edg[N],uedg[N];
    void dfs(int u)
    {
        if(u == n)
        {
            tot++;
            for(int i = 0;i<n;i++) puts(g[i]);
            puts("");
            return;
        }
        for(int i = 0;i<n;i++)
            if(!col[i] && !edg[i - u + n] && !uedg[i + u])
            {
                g[u][i] = 'Q';
                col[i] = edg[i-u+n] = uedg[i+u] = 1;
                dfs(u+1);
                col[i] = edg[i-u+n] = uedg[i+u] = 0;
                g[u][i] = '.';
            }
    }
    int main()
    {
        cin>>n;
        for(int i = 0;i<n;i++)
            for(int j = 0;j<n;j++)
                g[i][j] = '.';
        dfs(0);
    }

    注意:以8皇后为例

    1、正对角线的行+列总是相等的,如:(2,0)(1,1)(0,2),(3,0)(2,1)(1,2)(0,3)每次循环的时候u+i总是相等的。edg[i+u]

    2、斜对角线的差总是相等的,如:(0,6)(1,7),(0,5)(1,6)(2,7),(0,4)(1,5)(2,6)(3,7)每次循环u-i+n总是相等的,uedg[u-i+n]

    3、在到达递归边界 u == n的时候,输出的时候要用puts(g[i]),若用cout<<g[i];则会出现错误输出。

    4、在递归循环的时候,在递归完恢复状态的时候,因为之前全排列的时候数值会覆盖,而且一定会有值,但是这里要设置回点:g[u][i] = '.'

    n皇后问题还有一种更为朴素DFS搜索方式,就是从左到右,从上到下依次进行搜索。

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int N = 20;
    int n,tot;
    char g[N][N];
    bool row[N],col[N],edg[N],uedg[N];
    void dfs(int x,int y,int s)
    {
        if(y == n) x++, y = 0;
        if(x == n)
        {
            if(s == n)
            {
                for(int i = 0;i<n;i++) puts(g[i]);
                cout<<endl;
            }
            return;
        }
        dfs(x,y+1,s);
        if(!row[x] && !col[y] && !edg[x+y] && !uedg[x-y+n])
        {
            tot++;
            g[x][y] = 'Q';
            row[x] = col[y] = edg[x+y] = uedg[x-y+n] = true;
            dfs(x,y+1,s+1);
            row[x] = col[y] = edg[x+y] = uedg[x-y+n] = false;
            g[x][y] = '.';
        }
    }
    int main()
    {
        cin>>n;
        for(int i = 0;i<n;i++)
            for(int j = 0;j<n;j++)
                g[i][j] = '.';
        dfs(0,0,0);
    //    cout<<tot<<endl;
    }

    在这里通过 行x、列y、的方式进行全部搜索,如果每一行搜完,那么x++, y = 0; 如果x = n,皇后数量s = n那么此方案可行,输出返回。

    8皇后的全部解决方案:

    8

    .......Q

    ...Q....

    Q.......

    ..Q.....

    .....Q..

    .Q......

    ......Q.

    ....Q...

     

    .......Q

    ..Q.....

    Q.......

    .....Q..

    .Q......

    ....Q...

    ......Q.

    ...Q....

     

    .......Q

    .Q......

    ....Q...

    ..Q.....

    Q.......

    ......Q.

    ...Q....

    .....Q..

     

    .......Q

    .Q......

    ...Q....

    Q.......

    ......Q.

    ....Q...

    ..Q.....

    .....Q..

     

    ......Q.

    ....Q...

    ..Q.....

    Q.......

    .....Q..

    .......Q

    .Q......

    ...Q....

     

    ......Q.

    ...Q....

    .Q......

    .......Q

    .....Q..

    Q.......

    ..Q.....

    ....Q...

     

    ......Q.

    ...Q....

    .Q......

    ....Q...

    .......Q

    Q.......

    ..Q.....

    .....Q..

     

    ......Q.

    ..Q.....

    .......Q

    .Q......

    ....Q...

    Q.......

    .....Q..

    ...Q....

     

    ......Q.

    ..Q.....

    Q.......

    .....Q..

    .......Q

    ....Q...

    .Q......

    ...Q....

     

    ......Q.

    .Q......

    .....Q..

    ..Q.....

    Q.......

    ...Q....

    .......Q

    ....Q...

     

    ......Q.

    .Q......

    ...Q....

    Q.......

    .......Q

    ....Q...

    ..Q.....

    .....Q..

     

    ......Q.

    Q.......

    ..Q.....

    .......Q

    .....Q..

    ...Q....

    .Q......

    ....Q...

     

    .....Q..

    .......Q

    .Q......

    ...Q....

    Q.......

    ......Q.

    ....Q...

    ..Q.....

     

    .....Q..

    ...Q....

    ......Q.

    Q.......

    .......Q

    .Q......

    ....Q...

    ..Q.....

     

    .....Q..

    ...Q....

    ......Q.

    Q.......

    ..Q.....

    ....Q...

    .Q......

    .......Q

     

    .....Q..

    ...Q....

    .Q......

    .......Q

    ....Q...

    ......Q.

    Q.......

    ..Q.....

     

    .....Q..

    ...Q....

    Q.......

    ....Q...

    .......Q

    .Q......

    ......Q.

    ..Q.....

     

    .....Q..

    ..Q.....

    ......Q.

    ...Q....

    Q.......

    .......Q

    .Q......

    ....Q...

     

    .....Q..

    ..Q.....

    ......Q.

    .Q......

    .......Q

    ....Q...

    Q.......

    ...Q....

     

    .....Q..

    ..Q.....

    ......Q.

    .Q......

    ...Q....

    .......Q

    Q.......

    ....Q...

     

    .....Q..

    ..Q.....

    ....Q...

    .......Q

    Q.......

    ...Q....

    .Q......

    ......Q.

     

    .....Q..

    ..Q.....

    ....Q...

    ......Q.

    Q.......

    ...Q....

    .Q......

    .......Q

     

    .....Q..

    ..Q.....

    Q.......

    .......Q

    ....Q...

    .Q......

    ...Q....

    ......Q.

     

    .....Q..

    ..Q.....

    Q.......

    .......Q

    ...Q....

    .Q......

    ......Q.

    ....Q...

     

    .....Q..

    ..Q.....

    Q.......

    ......Q.

    ....Q...

    .......Q

    .Q......

    ...Q....

     

    .....Q..

    .Q......

    ......Q.

    Q.......

    ...Q....

    .......Q

    ....Q...

    ..Q.....

     

    .....Q..

    .Q......

    ......Q.

    Q.......

    ..Q.....

    ....Q...

    .......Q

    ...Q....

     

    .....Q..

    Q.......

    ....Q...

    .Q......

    .......Q

    ..Q.....

    ......Q.

    ...Q....

     

    ....Q...

    .......Q

    ...Q....

    Q.......

    ......Q.

    .Q......

    .....Q..

    ..Q.....

     

    ....Q...

    .......Q

    ...Q....

    Q.......

    ..Q.....

    .....Q..

    .Q......

    ......Q.

     

    ....Q...

    ......Q.

    ...Q....

    Q.......

    ..Q.....

    .......Q

    .....Q..

    .Q......

     

    ....Q...

    ......Q.

    .Q......

    .....Q..

    ..Q.....

    Q.......

    .......Q

    ...Q....

     

    ....Q...

    ......Q.

    .Q......

    .....Q..

    ..Q.....

    Q.......

    ...Q....

    .......Q

     

    ....Q...

    ......Q.

    .Q......

    ...Q....

    .......Q

    Q.......

    ..Q.....

    .....Q..

     

    ....Q...

    ......Q.

    Q.......

    ...Q....

    .Q......

    .......Q

    .....Q..

    ..Q.....

     

    ....Q...

    ......Q.

    Q.......

    ..Q.....

    .......Q

    .....Q..

    ...Q....

    .Q......

     

    ....Q...

    ..Q.....

    .......Q

    ...Q....

    ......Q.

    Q.......

    .....Q..

    .Q......

     

    ....Q...

    ..Q.....

    Q.......

    ......Q.

    .Q......

    .......Q

    .....Q..

    ...Q....

     

    ....Q...

    ..Q.....

    Q.......

    .....Q..

    .......Q

    .Q......

    ...Q....

    ......Q.

     

    ....Q...

    .Q......

    .......Q

    Q.......

    ...Q....

    ......Q.

    ..Q.....

    .....Q..

     

    ....Q...

    .Q......

    .....Q..

    Q.......

    ......Q.

    ...Q....

    .......Q

    ..Q.....

     

    ....Q...

    .Q......

    ...Q....

    ......Q.

    ..Q.....

    .......Q

    .....Q..

    Q.......

     

    ....Q...

    .Q......

    ...Q....

    .....Q..

    .......Q

    ..Q.....

    Q.......

    ......Q.

     

    ....Q...

    Q.......

    .......Q

    .....Q..

    ..Q.....

    ......Q.

    .Q......

    ...Q....

     

    ....Q...

    Q.......

    .......Q

    ...Q....

    .Q......

    ......Q.

    ..Q.....

    .....Q..

     

    ....Q...

    Q.......

    ...Q....

    .....Q..

    .......Q

    .Q......

    ......Q.

    ..Q.....

     

    ...Q....

    .......Q

    ....Q...

    ..Q.....

    Q.......

    ......Q.

    .Q......

    .....Q..

     

    ...Q....

    .......Q

    Q.......

    ....Q...

    ......Q.

    .Q......

    .....Q..

    ..Q.....

     

    ...Q....

    .......Q

    Q.......

    ..Q.....

    .....Q..

    .Q......

    ......Q.

    ....Q...

     

    ...Q....

    ......Q.

    ....Q...

    ..Q.....

    Q.......

    .....Q..

    .......Q

    .Q......

     

    ...Q....

    ......Q.

    ....Q...

    .Q......

    .....Q..

    Q.......

    ..Q.....

    .......Q

     

    ...Q....

    ......Q.

    ..Q.....

    .......Q

    .Q......

    ....Q...

    Q.......

    .....Q..

     

    ...Q....

    ......Q.

    Q.......

    .......Q

    ....Q...

    .Q......

    .....Q..

    ..Q.....

     

    ...Q....

    .....Q..

    .......Q

    ..Q.....

    Q.......

    ......Q.

    ....Q...

    .Q......

     

    ...Q....

    .....Q..

    .......Q

    .Q......

    ......Q.

    Q.......

    ..Q.....

    ....Q...

     

    ...Q....

    .....Q..

    Q.......

    ....Q...

    .Q......

    .......Q

    ..Q.....

    ......Q.

     

    ...Q....

    .Q......

    .......Q

    .....Q..

    Q.......

    ..Q.....

    ....Q...

    ......Q.

     

    ...Q....

    .Q......

    .......Q

    ....Q...

    ......Q.

    Q.......

    ..Q.....

    .....Q..

     

    ...Q....

    .Q......

    ......Q.

    ....Q...

    Q.......

    .......Q

    .....Q..

    ..Q.....

     

    ...Q....

    .Q......

    ......Q.

    ..Q.....

    .....Q..

    .......Q

    ....Q...

    Q.......

     

    ...Q....

    .Q......

    ......Q.

    ..Q.....

    .....Q..

    .......Q

    Q.......

    ....Q...

     

    ...Q....

    .Q......

    ....Q...

    .......Q

    .....Q..

    Q.......

    ..Q.....

    ......Q.

     

    ...Q....

    Q.......

    ....Q...

    .......Q

    .....Q..

    ..Q.....

    ......Q.

    .Q......

     

    ...Q....

    Q.......

    ....Q...

    .......Q

    .Q......

    ......Q.

    ..Q.....

    .....Q..

     

    ..Q.....

    .......Q

    ...Q....

    ......Q.

    Q.......

    .....Q..

    .Q......

    ....Q...

     

    ..Q.....

    ......Q.

    .Q......

    .......Q

    .....Q..

    ...Q....

    Q.......

    ....Q...

     

    ..Q.....

    ......Q.

    .Q......

    .......Q

    ....Q...

    Q.......

    ...Q....

    .....Q..

     

    ..Q.....

    .....Q..

    .......Q

    .Q......

    ...Q....

    Q.......

    ......Q.

    ....Q...

     

    ..Q.....

    .....Q..

    .......Q

    Q.......

    ....Q...

    ......Q.

    .Q......

    ...Q....

     

    ..Q.....

    .....Q..

    .......Q

    Q.......

    ...Q....

    ......Q.

    ....Q...

    .Q......

     

    ..Q.....

    .....Q..

    ...Q....

    .Q......

    .......Q

    ....Q...

    ......Q.

    Q.......

     

    ..Q.....

    .....Q..

    ...Q....

    Q.......

    .......Q

    ....Q...

    ......Q.

    .Q......

     

    ..Q.....

    .....Q..

    .Q......

    ......Q.

    ....Q...

    Q.......

    .......Q

    ...Q....

     

    ..Q.....

    .....Q..

    .Q......

    ......Q.

    Q.......

    ...Q....

    .......Q

    ....Q...

     

    ..Q.....

    .....Q..

    .Q......

    ....Q...

    .......Q

    Q.......

    ......Q.

    ...Q....

     

    ..Q.....

    ....Q...

    .......Q

    ...Q....

    Q.......

    ......Q.

    .Q......

    .....Q..

     

    ..Q.....

    ....Q...

    ......Q.

    Q.......

    ...Q....

    .Q......

    .......Q

    .....Q..

     

    ..Q.....

    ....Q...

    .Q......

    .......Q

    .....Q..

    ...Q....

    ......Q.

    Q.......

     

    ..Q.....

    ....Q...

    .Q......

    .......Q

    Q.......

    ......Q.

    ...Q....

    .....Q..

     

    ..Q.....

    Q.......

    ......Q.

    ....Q...

    .......Q

    .Q......

    ...Q....

    .....Q..

     

    .Q......

    .......Q

    .....Q..

    Q.......

    ..Q.....

    ....Q...

    ......Q.

    ...Q....

     

    .Q......

    ......Q.

    ....Q...

    .......Q

    Q.......

    ...Q....

    .....Q..

    ..Q.....

     

    .Q......

    ......Q.

    ..Q.....

    .....Q..

    .......Q

    ....Q...

    Q.......

    ...Q....

     

    .Q......

    .....Q..

    .......Q

    ..Q.....

    Q.......

    ...Q....

    ......Q.

    ....Q...

     

    .Q......

    .....Q..

    Q.......

    ......Q.

    ...Q....

    .......Q

    ..Q.....

    ....Q...

     

    .Q......

    ....Q...

    ......Q.

    ...Q....

    Q.......

    .......Q

    .....Q..

    ..Q.....

     

    .Q......

    ....Q...

    ......Q.

    Q.......

    ..Q.....

    .......Q

    .....Q..

    ...Q....

     

    .Q......

    ...Q....

    .....Q..

    .......Q

    ..Q.....

    Q.......

    ......Q.

    ....Q...

     

    Q.......

    ......Q.

    ....Q...

    .......Q

    .Q......

    ...Q....

    .....Q..

    ..Q.....

     

    Q.......

    ......Q.

    ...Q....

    .....Q..

    .......Q

    .Q......

    ....Q...

    ..Q.....

     

    Q.......

    .....Q..

    .......Q

    ..Q.....

    ......Q.

    ...Q....

    .Q......

    ....Q...

     

    Q.......

    ....Q...

    .......Q

    .....Q..

    ..Q.....

    ......Q.

    .Q......

    ...Q....

     

    118969

    Program ended with exit code: 0

  • 相关阅读:
    面向对象初识
    day 20 异常
    day 16 正则表达式
    day 13 生成器,推导式
    CSS
    html页面编写
    DAY 17常用模块
    DAY16 模块和包的导入
    DAY15 模块
    DAY14 函数(三)
  • 原文地址:https://www.cnblogs.com/longxue1991/p/12663528.html
Copyright © 2011-2022 走看看