回溯法----n后问题

  1. 算法分析: 从放置第一个皇后开始,不断向下搜索所有可行方案,提前打出10种结果,直接输出即可。注意每个皇后对角线判断的方法 abs(k-i)==abs(x[k]-x[i]))->对于在一条对角线上的两个皇后,其横坐标之差必定等于纵坐标之差。
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. #define N 8  
  6. int sum=0;  
  7. int *x=new int[N+1];  
  8.   
  9. bool place(int k)  
  10. {  
  11.     int i;  
  12.     for(i=1; i<k; i++)  
  13.     {  
  14.         if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k]))  //剪枝,即判断是否符合条件来放,i表示皇后所在的行数,x[i]表示所在的列数,                                                          //所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。  
  15.                                                     //行数不需要判断,因为他们本身的i就代表的是行数 
  16.             return false;  
  17.     }  
  18.     return true;  
  19. }  
  20.   
  21. void backtrack(int t)//递归回溯  
  22. {  
  23.     int i=0;  
  24.     if(t>N)  
  25.     {  
  26.         for(i=1; i<=N; i++)  
  27.             cout<<x[i]<<” “;  
  28.         cout<<endl;  
  29.         sum++;  
  30.     }  
  31.     else  
  32.     {  
  33.         for(i=1; i<=N; i++)  
  34.         {  
  35.             x[t]=i;  
  36.             if(place(t))  
  37.                 backtrack(t+1);  
  38.         }  
  39.     }  
  40. }  
  41. void main()  
  42. {  
  43.   
  44.     backtrack(1);  
  45.     cout<<sum<<endl;  
  46. }
  47. 参考博客:https://blog.csdn.net/u014492609/article/details/38534625
  48.         https://blog.csdn.net/cxllyg/article/details/8055596
    原文作者:回溯法
    原文地址: https://blog.csdn.net/qq_23304241/article/details/80233088
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞