1. 存储
因为每行只能放置一个皇后,故可用一维数组a[]存储 第i行皇后的列数,即 a[i]=j 表示第i行的皇后位于第j列。为方便起见,下标全部从1开始。它可以实时表示摆放的状态。
2. 递归算法
递归函数 queen(i) 可理解为:我们已经无冲突的摆放好了前(i-1)行的皇后并在数组a中存储,现在开始摆放第i行的皇后。对于第i行的摆法,我们遍历这一行的每一列j,如果位置(i,j)与前(i-1)的皇后都不冲突,则我们认为它是可行的,于是执行a[i]=j,即表示第i行的皇后位置是第j列,赋值完成即表示第i行摆放完成,然后递归的调用queen(i+1)继续摆放下一行。递归出口为i>N。当某一行的所有列已全部遍历完成后,就会自动回溯,同时还原数组a的状态。
另外,冲突指的是共行、共列或共对角线,因为是判断位置(i,j)与前i-1行是否冲突,必不可能同行,只需判断是否共列或共对角线即可,只要发生一次共线,则(i,j)必不可摆放,直接返回fasle,如果对前i-1行均不冲突,则返回true。
3. 代码实现
#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
#define MAXINT 100
int N;
int a[MAXINT];
bool place(int row,int col){
for(int i=1;i<row;i++){
if(a[i]==col||