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

原文地址:https://www.cnblogs.com/longxue1991/p/12663528.html