c++ 回溯算法-八皇后

//VC6.0-------------------das白 2019.12.28
#include"stdafx.h"
#include <cmath>
#include <iostream>
using namespace std;

//----------全局变量------------
#define n 8   //n皇后
int a[n]={0}; //棋盘  a[0]=5 则表示皇后在第一行 第六列
int sum=0;    //解的个数
//-----------------n皇后-----回溯算法--------------------
//检测皇后位置是否正确
bool Check_queen(int row,int col){
	//遍历前面所有皇后 判断是否与新皇后冲突
	for(int i=0;i<row;i++){
		//之前已经row+1(且是一维数组存储行列坐标) 无需判断是否同一行
		//判断其是否为同一列 或 是否斜率为1
		if( (a[i]==col) || (abs(row-i)==abs(col-a[i])) )
			return false;
	}
	//符合要求 
	return true;
}
//输出已求解的个数以及棋盘
void output(){
	sum+=1;
	cout<<"------ "<<sum<<" ------"<<endl;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[i]==j) cout<<"* ";
			else cout<<"0 ";
		}
		cout<<endl;
	}
}
//确定row+1个皇后
void Queen(int row,int col){  
	//如果已铺满棋盘 则输出棋盘
	if(row>=n){
		output();
		return ;   
	}
	if(col>=n) return;   //超出棋盘范围 放弃此解

	//确定第row+1个皇后位置
	if(Check_queen(row,col)){
		a[row]=col;
		Queen(row+1,0); //
		for(int i=row;i<n;i++)
			a[i]=0;       //下面几行皇后位置清零 寻找下一个可能的答案
	}
	//皇后位置右移
	Queen(row,col+1);
}
//------------------------------------------------------
void main()
{
	Queen(0,0);
}

八皇后输出:                            四皇后输出: