声明:解法来自 北京大学 郭炜老师的程序设计与算法(二)算法基础
仅作学习笔记
问题描述
在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)
样例输入
4
样例输出
2 4 1 3
3 1 4 2
代码
#include<iostream>
#include <string>
#include <cstring>
#include <math.h>
using namespace std;
int N;
int queenPos[100];
//用来存放算好的皇后位置,最左上角是(0,0)
void NQueen(int k){ //在0-k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
int i;
if(k==N){ //N个皇后已经摆好
for(i=0;i<N;i++){
cout<<queenPos[i]+1<<" ";
}
cout<<endl;
return ;
}
for(i=0;i<N;i++){ //逐步尝试第k个皇后的位置
int j;
for(j=0;j<k;j++){
//和已经摆好的k个皇后的位置比较,看是否冲突
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); //从第0行开始摆皇后
return 0;
}