dfs,注意恢复现场,标记状态
#include<cstdio>
#include<iostream>
using namespace std;
const int N=30;
int g[N][N]={0};
bool col[N], dg[N], udg[N];
int n, cnt=0;
void dfs(int u)
{
if(u==n)
{
cnt++;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(g[i][j] && cnt <= 3)
printf("%d ", g[i][j]);
}
}
if(cnt <= 3)
puts("");
return;
}
for(int i=0; i<n; i++)
{
if(!col[i] && !dg[u+i] && !udg[i-u+n])
{
col[i]=dg[u+i]=udg[i-u+n]=1;
g[u][i]=i+1;
dfs(u+1);
col[i]=dg[u+i]=udg[i-u+n]=0;
g[u][i]=0;
}
}
}
int main()
{
cin >> n;
dfs(0);
cout << cnt ;
return 0;
}
写是写出来了,但是运行好慢。