回溯法求n皇后问题
1、思路分析
采用回溯法,逐行确定满足条件“皇后”位置,再排除同列同一斜线上的位置。
* |
|
|
|
|
|
|
|
--- | --- | * |
|
|
|
|
|
--- | --- | --- | --- | * |
|
|
|
--- | --- | --- | --- | --- | --- | * |
|
--- | --- | --- | * | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
失败
* |
|
|
|
|
|
|
|
--- | --- | * |
|
|
|
|
|
--- | --- | --- | --- | * |
|
|
|
--- | --- | --- | --- | --- | --- |
| * |
--- | --- | --- | * | --- | --- | --- | --- |
--- | * | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
失败
* |
|
|
|
|
|
|
|
--- | --- | * |
|
|
|
|
|
--- | --- | --- | --- |
| * |
|
|
--- | * | --- | --- | --- | --- | --- |
|
--- | --- | --- | --- | --- | --- | * | --- |
--- | --- | --- | --- | * | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
失败
* |
|
|
|
|
|
|
|
--- | --- | * |
|
|
|
|
|
--- | --- | --- | --- |
| * |
|
|
--- |
| --- | --- | --- | --- | --- | * |
--- | * | --- | --- | --- | --- | --- | --- |
--- | --- | --- |
|
| --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
--- | --- | --- | --- | --- | --- | --- | --- |
失败
|
|
|
|
| * |
|
|
| * |
|
| --- | --- | --- |
|
--- | --- | --- | --- |
| --- | * | --- |
* | --- | --- | --- |
| --- | --- | --- |
| --- |
| * | --- | --- | --- |
|
--- | --- | --- | --- | --- | --- | --- | * |
| --- | --- | --- | * | --- | --- | --- |
--- | --- | * | --- | --- | --- | --- | --- |
成功
#include <iostream>
#include <cmath>
using namespace std;
bool Check(int row,int col,int *arr) //判断row行的col列是否满足条件
{
for(int i=0;i<row;i++) //只用和row行前的行比较
{
if(col==arr[i]||abs(row-i)==abs(col-arr[i])) //col==arr[i]表示同一列
//abs(row-i)==abs(col-arr[i])表示同一斜线
return false;
}
return true;
}
void FindNQueen(int k,int n,int &count,int *arr)
{
if(k==n) //当k抵达第n行说明安排成功
{
count++;
return;
}
for(int i=0;i<n;i++) //回溯法
{
if(Check(k,i,arr)) //k行i列安排成功
{
arr[k]=i;
FindNQueen(k+1,n,count,arr); //继续安排第(k+1)行
}
}
}
int main()
{
int n,*arr,count;
while(cin>>n)
{
count=0;
arr=new int [n];
FindNQueen(0,n,count,arr);
cout<<count<<endl;
}
return 0;
}