//8皇后问题 回溯法
#include "stdafx.h"
#include<iostream>
using namespace std;
bool check(int c[],int k) //检查是否合法,数组C是存储皇后的位置,k是当前皇后
{
int i;
for(i=1;i<=k-1;i++)
{
if(i==k)//在同一行
return false;
if(c[i]==c[k])//在同一列
return false;
if(k-i==c[k]-c[i])//在同一个对角线上
return false;
if(k-i==c[i]-c[k])//在同一个对角线上
return false;
}
return true;
}
void Queens(int n)
{
int *c=new int[n+1];
for(int i=1;i<=n;i++)
c[i]=0;
bool flag=false;
int k=1;
while(k>=1 && !flag)
{
while(c[k]<=n-1 && !flag)
{
c[k]=c[k]+1;
bool ch=check(c,k);
if(ch && k==n+1)//合法
{
flag=true;
}
else if(ch)//部分解
{
k=k+1;
}
}
c[k]=0;
k=k-1;//回溯
}
if(flag)//输出c
{
for(k=1;k<=n;k++)
cout<<c[k]<<"/t";
cout<<endl;
}
else
{
cout<<"No solution!"<<endl;
}
}
int main(int argc, char* argv[])
{
int i;
cout<<"皇后个数->"<<endl;
cin>>i;
Queens(i);
return 0;
}