设计:
用一个一维x数组代表N皇后第n行旗子所放置的位置,比如说x[i] = j代表第i+1行放置的位置是第j+1个格子
从第一行开始,将旗子从第一个位置放起,放下后判断其是否合法:
如果合法,继续放下一行,直到超出棋盘大小为止
如果不合法,则继续放这一行的下一个位置,继续判断是否合法
最后,如果放置的行数超过棋盘规格,证明前面n行的放置都是合法的,表示已经找到了一个解了
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class Queen{
private:
int n=4; //棋盘大小
int *x; //解空间
int sum=0; //解个数
public:
Queen(){}
Queen(int k);
~Queen();
bool Place(int k); //判断第k行的放置方法是否合法
void Back_track(int t); //寻找解
void print_sum(); //输出解的个数
};
void Queen::print_sum()
{
cout<<"sum:"<<sum<<endl;
}
Queen::Queen(int k)
{
n=k;
x = new int[k];
for(int i=0;i<n;i++)
x[i]=0;
}