经典的N皇后问题,利用回溯和递归的思想解决这个问题。 #include<stdio.h> #include<stdlib.h> int *x; int n; int sum=0; void Queen(); void Traceback(int r); int Place(r); void output(); int main() { scanf("%d",&n); x=(int *)malloc(sizeof(int)*n); Queen(); return 0; } void Queen() { Traceback(0); return; } void Traceback(int r) { int i; if(r>=n) { sum++; output(); } else { for(i=0;i<n;i++) { x[r]=i; if(Place(r)) Traceback(r+1); } } return ; } int Place(r) { int i; for(i=0;i<r;i++) { if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i])) return 0; } return 1; } void output() { int i,j; printf("the number is:%d/n",sum); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(x[i]==j) printf("*"); else printf("#"); } printf("/n"); } return ; } 非递归算法 #include "stdio.h" #include "stdlib.h" #include "time.h" /**//* 记录当前的放置方案 */ int *x; /**//* 皇后的个数N 和 方案数目 */ int n,sum=0; /**//* 检查参数所指示的这一行皇后放置方案是否满足要求 */ int Place(int); /**//* 非递归的方法求取皇后放置方案 */ void Queen2(void); /**//* 打印当前成功的放置方案 */ void PrintMethod(void); void main(void) { long start,stop; printf("input n: "); scanf("%d",&n); x=(int *)malloc(sizeof(int)*n); time(&start);/**//*记录开始时间*/ Queen2(); time(&stop);/**//*记录结束时间*/ printf("/nmethod total %d /n",sum); printf("/nuse %d seconds /n",(int)(stop-start)); } int Place(int r) { int i; for(i=0;i<r;i++){ if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i])) return 0; } return 1; } void Queen2(void) { int i,k; for(i=0;i<n;i++) x[i]=0; k=0; while(1){ if(x[k]>=n){ /**//* 如果当前第K行的放置位置超出了范围,那么检查该行是否为第0行 如果是第0行,说明所有的方案都已经遍历完毕,函数返回;否则回退到前一行 */ if(k==0) break; x[k]=0; /**//* 下次遍历的初始位置 */ k--; /**//* 返回上一行 */ x[k]++; /**//*下一种放置方案*/ } else if(!Place(k)){ /**//* 如果当前第K行的放置方案不满足要求,采取下一种放置方案*/ x[k]++; } else{ if(k==(n-1)){ /**//* 如果已经是最后一行,那么表示已经成功得到一种放置方案*/ sum++; /**//* PrintMethod(); */ x[k]=0; /**//*下次遍历的初始位置*/ k--; /**//*返回上一行*/ x[k]++; /**//*下一种放置方案*/ }else k++; /**//* 否则开始配置下一行的皇后 */ } } } void PrintMethod(void) { int i,j; printf("/nmethod %d/n",sum); for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(j==x[i]) printf("*"); else printf("#"); } printf("/n"); } }