问题不多说,相信大家都知道,直接上代码.
以下是两种解法:递归解法和回朔解法
#include <stdio.h> #include <stdbool.h> #define M 8 //修改此处改变皇后的基数 bool check(int *c,int addr); void q(int k); void display(int *c,int n); void qt(int k); int c[20]={0}; int main(void) { q(1); //非递归 printf("\n"); qt(1); //递归 return 0; } bool check(int *c,int k) { int i=0; for(i = k-1;i>=1;i--) { if(c[i]==c[k]||(c[i]-c[k]==i-k)||(c[i]+i==c[k]+k)) return false; } return true; } void display(int *c,int n) { int i=0,j=0; for(i=1;i<=n;i++) printf("%d ",c[i]); printf("\n"); } //递归解法 void q(int k) //k代表深度 { int i=0; for(i=1;i<=M;i++) { c[k] = i; if(check(c,k)) //判断当前皇后放置位置是否合理 { if(k==M) //到达最后一层,输出 { display(c,k); } else { q(k+1); //向下搜索 } } c[k] = 0; } } //非递归解法 void qt(int k) //k代表深度 { while(k>=1) //k=1为第一层 { while(c[k]<M) //搜索一层 { c[k]++; if(check(c,k)) //判断当前皇后放置位置是否合理 { if(k==M) //到达最后一层,输出 { display(c,k); } else { k++; //向下搜索 } } } c[k] = 0; //向上回朔,c[k]要初始化,防止数据污染 k--; //向上 } }