- 分析:从第一行到最后一行依次放置皇后,判断条件有三个:
- 这一列没有被标记
- 左下到右上没有被标记
右下到左上没有被标记
我们发现两条斜对角线线的坐标满足一定关系:
- 左下-右上:x+y相等
- 右下-左上:x-y相等(可能有负数,+n将结果区间右移)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int c[100],l[100],r[100],ans[100],n,sum;
void dfs(int row,int n)
{
for (int i = 1; i <= n; i += 1){
if (!c[i] && !l[row+i] && !r[row-i+n]){
c[i] = l[row+i] = r[row-i+n] = 1;
if (row == n) sum++;
else dfs(row+1,n);
c[i] = l[row+i] = r[row-i+n] = 0;
}
}
}
int main(int argc, char const* argv[])
{
for (int i = 1; i <= 10; i += 1){
sum = 0;
dfs(1,i);
ans[i] = sum;
}
while (cin >> n,n) cout << ans[n] << endl;
return 0;
}