1.问题
在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、以及45度斜线上都不能出现皇后的棋子,例子
2.思路
每个皇后必须放在不同行、不同列上、不同斜线上
3.代码
#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100];
//用来存放好的皇后位置。最左上角是(0,0);
void NQueen(int k)//前k-1个摆放好的前提下吗,摆放第 k个
{
int i;
if(k == N){ //N个皇后已经摆好
for(i=0; i < N; i++)
cout << queenPos[i] + 1 << " ";
cout << endl;
return;
}
//2.在 第 k 行上,逐个尝试第k个皇后的位置
for(i=0; i < N; i++){
int j;
for(j=0; j < k; j++){
//和已经摆好的 k 个皇后 的位置比较,看是否冲突。
//冲突1:在同一列上
//冲突2:斜线上,行差=列差
if(queenPos[j] == i ||
abs(queenPos[j] - i) == abs(k-j))
{
break;
}
}
if (j == k)//当前位置 i 不冲突
{
queenPos[k] = i;
NQueen(k+1);
}
}
}
int main()
{
cin >> N;
NQueen(0);//从第 0 行开始摆放
return 0;
}