n皇后问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。
设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入
输入数据只占一行,有1 个正整数n,n≤20。
输出
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
示例输入
5
示例输出
1 3 5 2 4
提示
请按照题目要求用分支限界法解题。
来源
示例程序
ACcode
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
int N;
int a[22];
int flag;
void show(){
if(flag)return ;
flag++;
int i;
for(i=0;i<N;++i)printf("%d ",a[i]+1);
printf("\n");
}
int check(int n){
int i;
for(i=0;i<n;i++)
{
if(a[i]==a[n]||fabs(n-i)==fabs(a[i]-a[n]))
return 0;
}
return 1;
}
void put(int n) {
int i;
if(flag)return;
if(n==N){
show();
return ;
}
for(i=0;i<N;i++){
a[n]=i;
if(check(n))
put(n+1);
}
}
int main (){
while(scanf("%d",&N)!=EOF){
flag=0;
put(0);
}
return 0;
}