码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-31 15:19:11      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

回溯算法的模型是 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语言回溯算法解决N皇后问题

标签:

原文地址:http://www.cnblogs.com/oyummy/p/4541994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!