#include <stdio.h> int count=0; /*记录四皇后问题解的个数*/ int isCorrect(int i,int j,int (*Q)[4]) { int s,t; for(s=i,t=0;t<4;t++) if(Q[s][t]==1 && t!=j)return 0; /*判断行*/ for(t=j,s=0;s<4;s++) if(Q[s][t]==1 && s!=i)return 0; /*判断列*/ for(s=i-1,t=j-1;s>=0&&t>=0;s--,t--) if(Q[s][t] == 1)return 0; /*判断左上方*/ for(s=i+1,t=j+1;s<4&&t<4;s++,t++) if(Q[s][t] == 1) return 0; /*判断右下方*/ for(s=i-1,t=j+1;s>=0&&t<4;s--,t++) if(Q[s][t] == 1) return 0; /*判断右上方*/ for(s=i+1,t=j-1;s<4&&t>=0;s++,t--) if(Q[s][t] == 1) return 0; /*判断左下方*/ return 1; /*否则返回1*/ } void Queen(int j,int (*Q)[4]){ int i , k; if(j==4) { /*得到了一个解*/ for(i=0;i<4;i++) { for(k=0;k<4;k++) printf("%d ",Q[i][k]); printf("\n"); } printf("\n"); count++; return; } for(i=0;i<4;i++) { if(isCorrect(i,j,Q)) /*如果Q[i][j]可以放置皇后*/ { Q[i][j] = 1; /*放置皇后*/ Queen(j+1,Q) ; /*深度优先搜索解空间树*/ Q[i][j] = 0; } } } int main() { int Q[4][4]; int i,j; for( i=0;i<4;i++) for( j=0;j<4;j++) Q[i][j] = 0; /*初始化数组Q*/ Queen(0,Q); /*执行四皇后求解*/ printf("The number of the answers of FOUR_QUEEN are %d",count); return 0; }
/*皇后问题求解*/ #include<stdio.h> #define n 8 int m=0,a[n+1]; /*存放第i个皇后放置的行号*/ int ok(int i,int j) /*检查(i,j)上能否放棋子*/ { int j1,i1,ok1; j1=j; i1=i; ok1=1; /*检查第i行上能否放棋子*/ while((j1>1)&&ok1) { j1--; ok1=a[j1]!=i; } j1=j; i1=i; /*检查对角线上能否放棋子*/ while((j1>1)&&(i1>1)&&ok1) { j1--; i1--; ok1=a[j1]!=i1; } j1=j; i1=i; /*检查另一对角线上能否放棋子*/ while((j1>1)&&(i1<n)&&ok1) { j1--; i1++; ok1=a[j1]!=i1; } return ok1; } void queen(int j) /*从第j列开始逐个试探*/ { int i; if (j>n) { m++; { printf("m=%d ",m); for (i=1;i<=n;i++) printf(" %d",a[i]); printf("\n"); } } else for( i=1;i<=n;i++) if(ok(i,j)) /*检查(i,j)上能否放棋子*/ { a[j]=i; /*在(i,j)上放一个棋子*/ queen(j+1) ; } } int main() { printf("\n************\n"); queen(1); }