南邮 OJ 1319 n皇后问题

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 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");
}







你可能感兴趣的:(ACM,n皇后问题,南邮OJ)