算法-n皇后问题

来源:互联网 发布:95社区源码 编辑:程序博客网 时间:2024/05/16 16:00

题目描述:一个 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;}


0 0
原创粉丝点击