n Queens Problem(回溯法)

来源:互联网 发布:阿里云服务器ftp登陆 编辑:程序博客网 时间:2024/05/21 09:56
#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  8int 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);}
复制代码
原创粉丝点击