八皇后问题可谓是非常古老经典,对菜狗的吸引力也很强,今天用递归方法来写一个。
#include <iostream>
using namespace std;
//数组中存储各皇后当前位置的行数,数组下标是各皇后的列数
int queensLocation[8]={-1,-1,-1,-1,-1,-1,-1,-1};
//可行方案的数量
int count=0;
//检查当前方格与已放置的皇后是否冲突
bool isLegal(int column,int row)
{
for(int i=0;i<row;i++)
{
//如果该点与之前的i个皇后位于同一行
if(column==queensLocation[i]) return false;
//如果该点与之前的皇后位于同一对角线(左上->右下)
if((column-queensLocation[i])==(row-i)) return false;
//如果该点与之前的皇后位于同一对角线(左下->右上)
if((column-queensLocation[i])==-(row-i)) return false;
}
return true;
}
//已有queensNum个皇后
void setQueens(int queensNum)
{
for(int i=0;i<8;i++)
{
if(isLegal(i,queensNum))
{
queensLocation[queensNum]=i;
if(7==queensNum)
{
++count;
break;
}
setQueens(queensNum+1);
}
}
//如果退到这里说明在第queensNum+1列中找不到合法的位置,需要退回上一列寻找
queensLocation[--queensNum]=-1;
}
int main()
{
setQueens(0);//从第一列开始查找
cout<<"count="<<count;
return 0;
}
当然八皇后问题不止可以用递归方法解决,还可以利用回溯法、迭代法甚至暴力法求解,但递归最容易理解(其实是写得快,想玩荒野行动),先从这里开始吧~