您的位置:首页 > 理论基础 > 数据结构算法

回溯法解决八皇后问题

2014-04-14 13:57 351 查看
#include <stdio.h>

#include <string.h>

//--------------回溯法解决八皇后问题P151----------//

//首先判断棋盘上是否已经得到一个完整的布局(即棋盘上是否已经摆放了8个棋子),若是,则输出该布局;

//否则,一次先根遍历满足约束条件的各个子树。

int total; //不能声明为static,不然对于其他的文件不可见

void Trial(int i, int n , int (* A )[8])

{

       total++;

        if (i > n)

       {

               static int num; //记录符合要求的个数

              num++;

              printf( "%d\n" ,num);

               for (int j=0;j<= n;j++)

              {

                      for (int k=0;k<= n;k++)

                           printf( "%d" ,A [j][k]);

                     putchar( '\n' );

              }

               //memset(A,0,sizeof(A));//无需在这里清零

               //putchar('\n');

       }

        else

               for (int j=0;j<= n;j++)

              {

                      int temp=true ;

                      for (int p=j;p>=0;p--)

                            if (A [ i][p]==1)

                                  temp= false ;

                      for (int p= i;p>=0;p--)

                            if (A [p][j]==1)

                                  temp= false ;

                      for (int p=j,k= i;
p>=0 && k>=0; p--,k--)

                            if (A [k][p]==1)

                                  temp= false ;

                      for (int p=j,k= i;
p<= n && k>=0; p++,k--)

                            if (A [k][p]==1)

                                  temp= false ;

                      if (temp)//合法则遍历

                     {

                            A [i ][j]=1; //如果合理,在这个位置放置一个棋子

                           Trial( i +1,n , A);

                            A [i ][j]=0; //这里就体现了回溯

                     }      

              }

}

main.cpp:

[align=left]
[/align]
[align=left]        //--------------TEST回溯法解决八皇后问题P151----------//[/align]
[align=left]        int A[8][8];[/align]
[align=left]
[/align]
[align=left]       memset(A,0, sizeof (A));[/align]
[align=left]       freopen( "f:\dataout.txt" , "w", stdout );[/align]
[align=left]       Trial(0,7,A);[/align]
        //extern int
total;
        //static int
total;
[align=left]       printf( "%d\n" ,total);//记录总共那个递归次数[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息