最近算法老师讲到了N皇后问题,我顺便在这边总结一下他的思路,主要还是深搜加剪枝.
解题思路:用数组c存储每个皇后在下标行中的位置(即列),然后进行深搜加剪枝判断,如果不符合条件了,则回朔.思路很简单,下面的代码包含两种解法.
#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) { qt(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--; //向上 } }