#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int const N = 20; //max support queen number
void printResult(int result[], int n, int m)
{
cout<<"output the "<<m<<" result:"<<endl;
for(int i = 1; i <= n; ++i)
cout<<"queen["<<i<<"]:"<<result[i]<<endl;
cout<<endl;
}
bool isValiadPlace(int result[], int k)
{
for (int i = 1; i < k; ++i)
{
if (result[i] == result[k] || abs(i - k) == abs(result[i] - result[k]))
return false;
}
return true;
}
void placeQueen(int n)
{
int result[N+1]; //the position of the queen, each queue position should be [1, n], result[k]:[1,n]
int i;
int k; //the queeen index
int sum = 0;// how many results we can find
for (i = 1; i <= N; i++)
result[i] = 0;
k = 1; //the first queen
while(k >= 1)
{
result[k]++; //the k queen take a step forward
//find a valid place for the queue[k]
while(result[k] <= n && !isValiadPlace(result, k))
result[k]++;
//if can find a valid place for queen[k]
if (result[k] <= n)
{
//have found valid place for all n queen
if (k == n)
{
sum += 1;
printResult(result, n, sum);
result[k] = 0;
--k;
}
else if (k < n)
{
k++;
}
}
else //trace barkward
{
result[k] = 0;
--k;
}
}
}
int main(void)
{
int n = 0;
cout << "put input the queen number:"<<endl;
cin >> n;
placeQueen(n);
return 1;
}
__________________________________________________
put input the queen number:
4
output the 1 result:
queen[1]:2
queen[2]:4
queen[3]:1
queen[4]:3
output the 2 result:
queen[1]:3
queen[2]:1
queen[3]:4
queen[4]:2
回溯算法 --- N 皇后问题
最新推荐文章于 2024-06-01 00:45:49 发布