虽然网上代码很多了,还是上传下自己写的,以前没看过这个问题。。。
用深度搜索写的,这个比较经典,但是n大了的话递归调用会很费时间。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
#define n 9 //多开一个,因为从1开始的
int visit[n];
int a[n];
int dfs(int row);
int can(int row);
int main()
{
memset(visit,0,sizeof(visit));
dfs(1);
return 0;
}
int dfs(int row)
{
int j;
if(row>n-1)
{
for(int i=1;i<=n-1;i++)
cout<<a[i]<<" ";
cout<<endl;
return 1;
}
for(int col=1;col<=n-1;col++)
{
a[row]=col;
if(visit[col]==0&&can(row))
{
visit[col]=1;
dfs(row+1);
visit[col]=0;
}
}
return 0;
}
int can(int row)
{
for(int i=1;i<row;i++)
if(abs(a[i]-a[row])==abs(i-row))
return 0;
return 1;
}