C语言回溯算法解决N皇后问题

回溯算法的模型是 x++, not satisfy ? x-- : continue.

代码中x作列号,y[x]保存第x列上皇后放置的位置。

 1 #include<stdio.h>

 2 #include<math.h>

 3 #define N 5

 4 int position_check(int,int*);

 5 void print_board(int count,int* y);

 6 int main()

 7 {

 8     int y[N]= {0}; //记录每列上的皇后放的位置

 9     int count = 0; //解的个数

10     int x = 1;

11     while(x>0)

12     {

13         y[x]++;      //为当前x位置找一个皇后的位置

14         while((y[x]<=N) && !position_check(x,y))

15             y[x]++; //找到合适的皇后

16         //

17         if(y[x]<=N)//找到一个可以放置第x个皇后的位置,到该步为止,所求部分解都满足要求

18         {

19             if(x==N)//找到一个完整的放置方案

20             {

21                 count++;

22                 printf("%d\n",count);

23                 for( int i=1; i<=N; i ++ )

24                 {

25                     for( int j=1; j<=N; j++ )

26                         if( j==y[i] ) printf("x ");//如果该位置放了皇后则显示x

27                         else printf("o ");

28                     printf("\n");

29                 }

30             }

31             else

32                 x++; //继续寻找下一个皇后的位置,还没找到完整解决方案

33         }

34         else//未找到可以放置第x个皇后的位置,到该步为止,已经知道不满足要求

35         {

36             y[x] = 0;//因为要回溯,下一次是寻找第x-1个皇后的位置,

37             //在下一次确定x-1的位置之后,第x个皇后的开始搜索的位置要重置

38             x--; //回溯

39         }

40     }

41 }

42 int position_check(int k,int* y) //测试合法性

43 {

44     for(int j = 1; j < k; j++)

45         if((abs(k-j) == abs(y[j] - y[k]))||(y[j] == y[k]))

46             return 0;

47     return 1;

48 }
View Code

看了唐大仕老师的8皇后改的,基本是复制粘贴 ( ╯□╰ )

 

你可能感兴趣的:(C语言)