算法-n皇后问题

题目描述:一个 n*n 的棋盘,要在上面放 n 个皇后。规则:两个皇后之间如果是同列、同行、同对角线它们会互相攻击。也就

说:棋盘上的任意两个皇后不能为同列、同行、同对角线。


算法思想:q(j)表示一个解的空间即存储一组可行解的数组,j表示行数,q(j)的值表示j行可以放置皇后的所在列数,根据任意

两个皇后不能在同列、同对角线可得放置皇后的条件是

(1) q( i ) != q( k );

(2) abs( q( i ) - q( k ) ) != abs( i - k )。

当可以放置皇后时就继续到下一行,不能放置则尝试该行的下一列位置,重新检测,如此反复,直到将所有解解出。

#include <stdio.h>
#include <math.h>
#define N 15    //规定皇后最多为15个 
int q[N];         //记录各皇后所在的列号
int count = 0;
int check(int i,int k){//检验第i行的k列上是否可以摆放皇后
	int j=1;
	while(j<i){  //j=1~i-1是已经放置了皇后的行	
		//第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上
		if(q[j]==k || abs(j-i)==abs(q[j]-k)) 
			return 0;
		j++;
	}
	return 1;
}
void print(int n){
	int i,j;
	printf("第%d个解:",count);
	for(i=1;i<=n;i++)
		printf("(%d,%d) ",i,q[i]);
	printf("\n");
}
void place(int i,int n) {//放置皇后到棋盘上 
	int j;
	if(i>n){
		++count;
		print(n);	
	} else {
		for(j=1;j<=n;j++){   //试探第i行的每一个列
		
			if(check(i,j)){
				q[i] = j;
				place(i+1,n);  //上一任务完成时才进行下一个任务
			}
		}
	}
}
int main(void){
	int n;
	scanf("%d",&n);
	if(n<=15)
		place(1,n);
	printf("%d\n",count);
	return 0;
}


posted @ 2016-05-18 16:36  baalhuo  阅读(340)  评论(0编辑  收藏  举报