- 算法分析: 从放置第一个皇后开始,不断向下搜索所有可行方案,提前打出10种结果,直接输出即可。注意每个皇后对角线判断的方法 (abs(k-i)==abs(x[k]-x[i]))->对于在一条对角线上的两个皇后,其横坐标之差必定等于纵坐标之差。
- #include <iostream>
- using namespace std;
- #define N 8
- int sum=0;
- int *x=new int[N+1];
- bool place(int k)
- {
- int i;
- for(i=1; i<k; i++)
- {
- if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k])) //剪枝,即判断是否符合条件来放,i表示皇后所在的行数,x[i]表示所在的列数, //所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。
- //行数不需要判断,因为他们本身的i就代表的是行数
- return false;
- }
- return true;
- }
- void backtrack(int t)//递归回溯
- {
- int i=0;
- if(t>N)
- {
- for(i=1; i<=N; i++)
- cout<<x[i]<<” “;
- cout<<endl;
- sum++;
- }
- else
- {
- for(i=1; i<=N; i++)
- {
- x[t]=i;
- if(place(t))
- backtrack(t+1);
- }
- }
- }
- void main()
- {
- backtrack(1);
- cout<<sum<<endl;
- }
- 参考博客:https://blog.csdn.net/u014492609/article/details/38534625
- https://blog.csdn.net/cxllyg/article/details/8055596
回溯法----n后问题
原文作者:回溯法
原文地址: https://blog.csdn.net/qq_23304241/article/details/80233088
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_23304241/article/details/80233088
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。