不正经的排列数字
#include <algorithm>里有next_permutation(a,a+n)
要写do while,不能漏掉第一次
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10;
int a[N];
bool st[N];
int n;
int main()
{
scanf("%d", &n);
for(int i=0;i<n;i++){
a[i]=i+1;
}
do
{
for(int i=0;i<n;i++){
cout<<a[i]<<' ';
}
cout<<endl;
}
while(next_permutation(a,a+n));
}
#include <iostream>
using namespace std;
const int N = 10;
int res[N];
bool vis[N];
int n;
void dfs(int u){
if(u==n+1) {
for(int i=0;i<n;i++)
cout<<res[i]<<' ';
cout<<endl;
}
else{
for (int i = 1; i <= n; i++)
{
if(!vis[i]){
vis[i]=1;
res[u-1]=i;
dfs(u+1);
vis[i]=0;
res[u-1]=0;
}
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
关于n皇后,如果用二维数组依次枚举,会爆时间
#include<iostream>
using namespace std;
const int N=20;
bool col[N],dg[N],vdg[N];
char g[N][N];
int n;
void dfs(int u){
if(u==n)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%c",g[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
else{
for(int i=0;i<n;i++){
if(!col[i]&&!dg[u+i]&&!vdg[n-u+i]){
g[u][i]='Q';
col[i]=1;
dg[u+i]=1;
vdg[n-u+i]=1;
dfs(u+1);
g[u][i]='.';
col[i]=0;
dg[u+i]=0;
vdg[n-u+i]=0;
}
}
}
}
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;
}
第i行 第u+i列 斜对角线是n-u+i