要求在n*
n格的棋盘上放置彼此不会相互攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入棋盘的大小n(1<n<12)。
输出格式:
对于每组测试,输出满足要求的方案个数。
abs(row - i) == abs(col - x[i]) 主要解释一下这段代码,皇后不在斜线上,无非就不在k=+-1上
#include <iostream>
#include <algorithm>
#include <math.h>
#include <memory.h>
using namespace std;
#define max 13
int x[max + 1];
int n;
int sum;
bool Place(int row, int col)
{
for (int i = 1; i < row; i++)
{
if (col == x[i] || abs(row - i) == abs(col - x[i]))
return false;
}
return true;
}
void Backtrack(int t,int n)
{
if (t == n+1)
sum++;
else
{
for (int i = 1; i <= n; i++)
{
x[t] = i;
if (Place(t, x[t]))
Backtrack(t + 1, n);
}
}
return ;
}
int main()
{
while(cin >> n)
{
memset(x,0,sizeof(x));
sum=0;
Backtrack(1,n);
cout <<sum<<endl;
}
return 0;
}