Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4653
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 51
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-31 23:39
文章分类
文章存档

2014年(6)

我的朋友
最近访客

分类: C/C++

2014-09-06 23:20:47

既然能搜到这篇文章,八皇后问题的规则就不多说了。。。。那什么是回溯算法:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

简单地举个例子十进制来说:你从零数到一百过程中(000--100),个位满10时,需要回溯到十位并在十位加1并且个位归零。当十位满10时(如099+1),又要在百位加1并且十位和个位归零。。。。。八皇后问题就类似如此。

点击(此处)折叠或打开

  1. /*
  2. * 1)八皇后问题是在N×8的棋盘上
  3. * 2)可以利用一个queen[8]数组存放每行皇后在这行的位置
  4. * 如:queen[3]=7 表示第3行的皇后在第七个位置(从0开始)
  5. * 3)八皇后位置成立的公式:queen[now_row]!=queen[row],| queen[now_row]-queen[row] | != |now_row-row|
  6. * (其中now_row为当前行,row为前now_row-1行,row=0.1.2.3.....now_row-1)
  7. */
  8. #include <stdio.h>
  9. #include <math.h>
  10. #define N 8

  11. main()
  12. {
  13.     int queen[N];
  14.     int now_row,row;
  15.     int count = 1;

  16.     for(now_row = 0; now_row < N; now_row++) queen[now_row] = 0;

  17.     for(now_row = 0;;)
  18.     {
  19.         if(queen[now_row] < N)
  20.         {
  21.             row = 0;
  22.             /* 拿那当前第now_row行的皇后位置与前面的第row行(从0开始)皇后位置的比较,
  23.             * 如果有冲突跳出while循环,且row一定小于;则执行后面的queen[now_row]++(走后一位),然后重新比较
  24.             * 如果没有冲突,是由于row=now_row推出的,则这次的位置是可以的,继续下一行(now_row+1)
  25.             */
  26.             while( row<now_row && queen[now_row]!=queen[row] && abs(queen[now_row]-queen[row])!=abs(now_row-row)) row++;
  27.             if( row < now_row)
  28.             {
  29.                 queen[now_row]++;
  30.                 continue;
  31.             }
  32.             if( queen[now_row] >= N) continue;   /*如果第now_row行都摆完没有合适的位置,则回到now_row-1行*/
  33.             now_row++;                           /*如果第now_row行有合适的位置,则继续摆第now_row+1行*/
  34.             if(now_row < N) continue;            /*如果摆完最后一行(也就是now_row++为8),则出来一个结果*/
  35.             print(queen,N,count);
  36.             count++;
  37.             queen[N-1]++;                        /*尝试最后一行剩下的位置*/
  38.             now_row = N-1;
  39.         }
  40.         else
  41.         {
  42.             /*回溯,第now_row行满时,回到第now_row-1行,queen[now_row]归零,queen[now_row-1]后走一位*/
  43.             queen[now_row] = 0;
  44.             now_row--;
  45.             if(now_row < 0)
  46.             {
  47.                printf("THE END\n");
  48.                return 0;
  49.             }
  50.             else
  51.                 queen[now_row]++;
  52.         }

  53.     }
  54. }

阅读(398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~