N 皇后求解回溯算法

本文介绍了一个8皇后问题的求解算法,通过递归回溯的方法找到所有可能的解,并详细解释了判断皇后间冲突的逻辑及输出解决方案的具体形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. /*******************************************************
  2. *   n 后求解问题
  3. *******************************************************/
  4. #include <iostream.h>
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include <conio.h>
  8. #define MAXNUMBER 20  //最大求解数
  9. //输出n后的解
  10. /******************************************************
  11. *   例如8皇后的一组解为:
  12. *    1  5  8  6  3  7  2  4
  13. *   其含义为
  14. *   第1个皇后位于 第1行第 1 列
  15. *   第2个皇后位于 第2行第 5 列
  16. *   第3个皇后位于 第3行第 8 列
  17. *   第4个皇后位于 第4行第 6 列
  18. *   ......
  19. *   第i个皇后位于 第i行第 x[i] 列 (i >= 1)
  20. ******************************************************/
  21. void output_queens(int x[],int n)
  22. {
  23.     for(int i=1;i<=n;i++)
  24.         printf("%3d",x[i]);
  25.     printf("/n");
  26. }
  27. //判断第k个皇后是否合法
  28. bool check(int x[],int k)
  29. {
  30.     for(int i=1;i<k;i++)
  31.     {//列冲突x[i]==x[k] 或 斜线冲突abs(k-i)==abs(x[k]-x[i])
  32.         if(x[i]==x[k] || abs(k-i)==abs(x[k]-x[i]))
  33.             return false;
  34.     }
  35.     return true;
  36. }
  37. /*******************************************************
  38. *  n后问题求解
  39. *  input  : n, the number of queens
  40. *  output : the vector of solution, X
  41. *******************************************************/
  42. int n_queens(int n,int x[])
  43. {
  44.     int nCount=0;       //解的个数
  45.     int k=1;            //先处理第 1 个皇后
  46.     x[1]=0;
  47.     while(k>0)
  48.     {
  49.         x[k]=x[k]+1;    //在当前列加1的位置搜索
  50.         while(x[k]<=n && !check(x,k))
  51.             x[k]=x[k]+1;//如果当前列x[k]不满足条件 则搜索下一列x[k]+1
  52.         
  53.         if(x[k]<=n)
  54.         {//列x[k]满足条件
  55.             if(k==n)
  56.             {//当前是最后一个皇后 => 得到一组解
  57.                 //break; //若此处break 则只得到一组解
  58.                 nCount++;//解的个数加1
  59.                 output_queens(x,n); //输出n后的解
  60.             }else
  61.             {//计算第 k+1 个皇后
  62.                 k++;
  63.                 x[k]=0;
  64.             }
  65.         }else
  66.         {//不存在满足条件的列 => 回溯
  67.             x[k]=0;
  68.             k--;
  69.         }
  70.     }
  71.     return nCount;
  72. }
  73. void main()
  74. {
  75.     int n=8;
  76.     int x[MAXNUMBER]={0};
  77.     
  78.     printf("Game Start:/n");
  79.     int nCount=n_queens(8,x);
  80.     printf("TotalNumber:%4d/n",nCount);
  81.     printf("Game over !!!/n/n/n");
  82. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值