/*************************************************************************
> File Name: eight_queen.cpp
> Author: Bob
************************************************************************/
#include<iostream>
#include<iomanip>
#include<stdlib.h>
#include<stdio.h>
#define EIGHT 8
using namespace std;
int queen[EIGHT];
int number = 0;
/*
*打印函数
*/
void print( )
{
int x = 0 , y = 0 ;
number += 1 ;
cout << endl;
cout << "this is the "<< number << "solution"<<endl;
for ( x= 0 ; x < EIGHT ; x ++)
{
for ( y = 0 ; y < EIGHT ; y ++)
{
if ( x == queen[y] )
{
cout << "<p>";
}
else
cout << "<->";
}
cout << endl;
}
getchar();
}
/*
*检查 皇后 放入 是否有危险
*
* queen_No : 皇后编号
*
* position : 该皇后放入的位置
*
* 通过 斜率 检查 , 同行 检查
*
* */
bool check_queen( int queen_No , int position)
{
int i = 0 ;
int fx , fy ;
while ( i < queen_No )
{
fx = abs ( i - queen_No );
fy = abs ( position - queen[i] );
if ( fx == fy || position == queen[i] )<span style="white-space:pre"> </span>
{
return false ;
}
i++;
}
return true ;
}
/*
*
* 决定皇后位置
* 采用递归
* */
int decide_position(int queen_No )
{
int tem_position = 0 ;
while ( tem_position < EIGHT )
{
if ( check_queen ( queen_No , tem_position) ) // 如果皇后放入无危险
{
// 则记录
queen[ queen_No ] = tem_position ;
if ( queen_No == EIGHT-1 )
{
print();
}
else
decide_position ( queen_No + 1 ); // 如果 皇后未处理完 进入递归
// 下一皇后 while 循环完毕 不满足 则返回至 该皇后的这一位置
// 并且 使该皇后尝试下一位置
}
tem_position ++ ;
}
}
int main( )
{
decide_position( 0 );
return 0;
}