#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 10
int n; //皇后数,棋盘大小
int q[MAXN]; //放置的皇后的位置,q[i]表示:第i个皇后的位置在第i行,第q[i]列
int count; //可行方案数
bool IsPlaceable(int x, int y)
{
int i;
for (i = 1; i < x; i++)
{
if (abs(i-x) == abs(q[i]-y) || q[i] == y)
{
return false;
}
}
return true;
}
void Backtrack(int k)
{
if (k > n)
{
count++;
/*
printf("方法%d:\n", count);
int i;
for (i = 1; i <= n; i++)
{
printf("%d: %d %d\n", i, i, q[i]);
}
*/
}
else
{
int i;
for (i = 1; i <= n; i++)
{
if (IsPlaceable(k, i))
{
q[k] = i;
Backtrack(k+1);
}
}
}
}
int main(void)
{
while (scanf("%d", &n) != EOF)
{
count = 0;
Backtrack(1);
printf("%d\n", count);
}
return 0;
}
第5章 回溯法,n皇后问题
最新推荐文章于 2021-08-17 12:33:40 发布