ACM板子 第三章 搜索与图论

1.DFS

【1.1】排列数字

#include<iostream>
using namespace std;
const int N=10;
int n;
int path[N];
bool st[N];
void dfs(int u)
{
    if(u==n)//到了第n层则输出
    {
        for(int i=0;i<n;i++)
            cout<<path[i]<<' ';
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i])//如果这个位置没有被用过
        {
            path[u]=i;//把i放在当前位置
            st[i]=true;//并且i已经被用过了
            dfs(u+1);//递归到下一层
            st[i]=false;//恢复现场
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
}

【1.2】N皇后问题

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 20;
 4 int n;
 5 char g[N][N];
 6 bool col[N], dg[N], udg[N];
 7 void dfs(int u)
 8 {
 9     if (u == n)
10     {
11         for (int i = 0; i < n; i ++ ) puts(g[i]);
12         puts("");
13         return;
14     }
15     for (int i = 0; i < n; i ++ )
16         if (!col[i] && !dg[u + i] && !udg[n - u + i])
17         {
18             g[u][i] = 'Q';
19             col[i] = dg[u + i] = udg[n - u + i] = true;
20             dfs(u + 1);
21             col[i] = dg[u + i] = udg[n - u + i] = false;
22             g[u][i] = '.';
23         }
24 }
25 
26 int main()
27 {
28     cin >> n;
29     for (int i = 0; i < n; i ++ )
30         for (int j = 0; j < n; j ++ )
31             g[i][j] = '.';
32     dfs(0);
33     return 0;
34 }

 

posted @ 2022-04-20 15:32  may0113  阅读(38)  评论(0)    收藏  举报