题目
在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
输出的棋盘中,“1”代表此位置有皇后,“0”代表此位置为空。
代码
#include<iostream>
#include<cmath>
using namespace std;
//N个皇后
int N;
//存放皇后的位置
//如queenPos[3]=8,则第三个皇后在第八列(3,8)
int queenPos[100];
//从第k个位置开始摆放皇后,k从零开始计数
void NQueen(int k)
{
if(k==N){
for(int i=0;i<N;i++){
int j=0;
for(;j<queenPos[i];j++){
cout << 0;
}
cout<<1;
j++;
for(;j<N;j++){
cout<<0;
}
cout << endl;
}
// for(int i=0;i<N;i++)cout <<queenPos[i] + 1 <<" ";
cout << endl;
return ;
}
for(int i=0;i<N;i++)//测试第k个皇后的位置i
{
int j=0;
for(;j<k;j++){
if(queenPos[j]==i || abs(queenPos[j]-i)==abs(k-j) )break;
}
if(j==k){
queenPos[k]=i;
NQueen(k+1);
}
}
}
int main(){
cin >> N;
NQueen(0);
return 0;
}
心得
方格坐标中,若两点在同一条直线上(直线/斜线),则
abs ( x1 - x2 ) == abs ( y1 - y2 )