回溯法解决N皇后问题

来源:互联网 发布:js 特殊字符校验 编辑:程序博客网 时间:2024/06/10 18:27



#include<stdio.h>int place(int x[ ],int k){    int i;      for (i=1;i<k;i++)           if ((x[i]==x[k])||(abs(x[i]-x[k])==abs(i-k)))   return 0;     return 1;}void print(int n,int x[]){int i;for(i=1;i<=n;i++)    printf("%d ",x[i]);printf("\n");}void n_queens(int n,int x[]){     int k = 1;   /* k:搜索深度 */    x[1] = 0;    while (k>0) {        x[k] = x[k] + 1;/* 在当前列加1的位置开始搜索 */        while((x[k]<=n)&&(!place(x,k)))    /* 当前列位置是否满足条件 */            x[k]=x[k]+1; /* 不满足条件,继续搜索下一列位置 */        if (x[k]<=n) {/* 存在满足条件的列? */            if (k==n) {print(k,x);}/* 是最后一个皇后,完成搜索 */            else {                k= k+1;   x[k]=0; /* 不是,则处理下一个行皇后 */            }        }        else {/* 已判断完n列,均没有满足条件 */            x[k]=0;   k-=1; }  /* 第k行复位为0,回溯到前一行 */    }}int main(){int i,n,a[10];while(scanf("%d",&n)!=EOF){    n_queens(n,a);    printf("\n");}return 0;} 


0 0
原创粉丝点击