这两道题其实实质上是一样的,其实本质上都是n个数的全排列
在复习dfs的时候其实单个模拟一下dfs的递归过程更好的理解代码是怎样实现的
还有就是终止递归的判断条件中无论条件怎样都要添加return
八皇后问题
https://www.acwing.com/problem/content/845/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 20;
int n;
char g[N][N];
bool col[N], row[N], dg[N], updg[N];
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i ++) cout << g[i] << endl;
puts("");
return;
}
for(int i = 0; i < n; i ++)
if(!col[i] && !dg[u + i] && !updg[u - i + n])
{
g[u][i] = 'Q';
col[i] = dg[u + i] = updg[u - i + n] = true;
dfs(u + 1);
col[i] = dg[u + i] = updg[u - i + n] = false;
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);
return 0;
}
排列数字问题
https://www.acwing.com/problem/content/844/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10;
int n;
int p[N];
bool st[N];
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i ++) printf("%d ", p[i]);
puts("");
return;
}
for(int i = 1; i <= n; i ++)
{
if(!st[i])
{
p[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}