八皇后问题是找到8*8里那个特定的情形,即8个皇后不能互相攻击,不能同行,不能同列,也不能正反斜对。
此问题是对所有问题依次进行遍历,查看是否满足条件。以4*4 为例子。
用图形表示如下:
憋了半天,没想到什么好办法。研究生了,笨得跟猪一样。直接暴力法,管他,计算机总得算出来。
采用递归,回溯。贴代码:
/*
Coder e_mail:shenganbeiyang@163.com
QQ :501968942
*/
#include"iostream"
using namespace std;
void GetGoodResolution(int,int);
bool IsConfliction(int * ,int );
void printQueen(int *);
const int N=8;
static int count=0;
int a[N];//下标表示行数,数组的值表示列数。所以行数一定不相同,我们只要考虑列数就可以了
int main()
{
GetGoodResolution(0,N);
cout<<"总共输出个数为:"<<count;
return 0;
}
//采用递归实现
void GetGoodResolution( int r,int N)//r表示行数
{
if(r==N) return;//运行到最后一行了,返回
for(int j=0;j<N;++j)//j是列号
{
a[r]=j;
if(!IsConfliction(a,r))
{
// a[r]=j;
if(r==N-1) {printQueen(a);count++;}
GetGoodResolution( r+1, N);//递归调用
}
//if(j==N-1&&IsConfliction(a,j))
//{
//}
// GetGoodResolution( r, N);//递归调用
}
}
bool IsConfliction(int * a,int len)
{
for(int i=0;i<len;++i)
{
if(a[i]==a[len]||a[i]-a[len]==len-i||a[len]-a[i]==len-i)
{
return true;
break;
}
}
return false;
}
void printQueen(int *a)
{
for(int i=0;i<N;++i)
cout<<i<<","<<a[i]<<" ";
cout<<endl;
}
测试: