算法-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; }