南邮 OJ 1319 n皇后问题

来源:互联网 发布:淘宝外贸店为什么便宜 编辑:程序博客网 时间:2024/06/04 20:09

n皇后问题

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 140            测试通过 : 32 

比赛描述

 

n×格的棋盘上放置彼此不受攻击的个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何个皇后不放在同一行或同一列或同一斜线上。设计一个解后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。



输入

 

第一行有1 个正整数n。

输出

 

将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。

样例输入

5

样例输出

1 3 5 2 4

提示

 

题目来源

算法设计与实验题解



#include<stdio.h>#define N 100bool 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");}







0 0
原创粉丝点击