n皇后问题
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 140 测试通过 : 32
总提交 : 140 测试通过 : 32
比赛描述
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。设计一个解n 后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入
第一行有1 个正整数n。
输出
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
样例输入
5
样例输出
1 3 5 2 4
提示
题目来源
算法设计与实验题解
#include<stdio.h>
#define N 100
bool map[N][N];
bool find;
int n;
bool canPlace(int p, int q){
int i,j;
for(i=0; i<n; i++){ //同一列
if(map[i][q]){
return 0;
}
}
for(j=0; j<n; j++){ //同一行
if(map[p][j]){
return 0;
}
}
for(i=p,j=q; i>=0 && j>=0; i--,j--){ //左上
if(map[i][j]){
return 0;
}
}
for(i=p,j=q; i<n && j>=0; i++,j--){ //右上
if(map[i][j]){
return 0;
}
}
for(i=p,j=q; i<n && j<n; i++,j++){ //右下
if(map[i][j]){
return 0;
}
}
for(i=p,j=q; i>=0 && j<n; i--,j++){ //左下
if(map[i][j]){
return 0;
}
}
return 1;
}
void handle(int i){
if(find){
return;
}
int j;
for(j=0; j<n && !find; j++){
if(canPlace(i,j)){
map[i][j] = 1;
if(n-1==i){
find = 1;
return;
}else{
handle(i+1);
}
if(!find){
map[i][j] = 0;
}
}
}
}
int main(){
int i,j;
scanf("%d",&n);
handle(0);
for(i=0; i<n; i++){
for(j=0; j<n; j++){
if(map[i][j]){
printf("%d ",j+1);
break;
}
}
}
printf("\n");
}