N皇后问题(dfs)
题目
可以算得上是模板题目/裸题了
SDNU 1559
先贴上不用dfs的方法
PS:这里先解释一下next_permutation函数,简单的来说就是把一堆数进行全排列(按一定顺序),我嘴笨肯定解释不明白,所以还请各位移步这篇博客或自行百度进行了解,当然,不懂原理直接用也是可以的。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[15];
bool check()
{
int w=1;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]+(j-i)==a[j]||a[i]-(j-i)==a[j])//检验是否在一条对角线上
{
w=0;break;
}
else w=1;
}
if(w==0)break;
}
if(w==1)return true;
else return false;
}
int main()
{
int ans;
while(cin>>n)
{
if(n==0)break;
ans=0;
for(int i=1;i<=n;i++)a[i]=i;
do
{
if(check())ans++;
}while(next_permutation(a+1,a+n+1));
cout<<ans<<endl;
}
return 0;
}
方法二:(dfs)
管他会不会,先把代码贴上
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int b[13],a[13];
int n,i;int ans;
void dfs(int x) //dfs函数是关键
{
bool w=1;
if(x==i+1) //当搜完最后一行之后结束递归
{
ans++;return ;
}
for(int j=1;j<=i;j++) //从第1列开始放,一共j列
{
b[x]=j;w=1; //b[x]代表第x行放在哪个位置
for(int k=1;k<x;k++)
{
if(b[x-k]==j||fabs(x-k)==fabs(j-b[k]))//判断是否在同一对角线上
{
w=0;break;
}
}
if(w==1)
dfs(x+1);
}
}
int main()
{
for(i=1;i<=10;i++) //打表
{
ans=0;
dfs(1);
a[i]=ans;
}
while(cin>>n)
{
if(n==0)break;
cout<<a[n]<<endl;
}
return 0;
}
暴力搜索,从第一行第一个开始一个个放,可行就在下一行放,直到该情况放完,ans+1,直到搜完,得出结果。
PS:虽然很简单但一开始却花了好长时间理解,至于应用简单的还可以,复杂的恐怕还会出错,,,真是菜的可以,,,/捂脸