定义:
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。
但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<cmath> #include<stdlib.h> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<iomanip> using namespace std; int N; int a[11]; int ans; //i表示第几行,a[i]表示第几列 bool judge(int r) { for(int i=1;i<r;i++) { if(a[r]==a[i]||abs(a[r]-a[i])==abs(i-r)) return 0; } return 1; } void hang(int r) { if(r>N) ans++; else { for(int i=1;i<=N;i++)//遍历第r行的所有列。 { a[r]=i; if(judge(r)) hang(r+1); } } } int main() { while(cin>>N&&N!=0) { ans=0; hang(1); cout<<ans<<endl; } return 0; }
i代表第几行,a[i]代表第几列,递推。
从第一行开始放,然后遍历每一列。同时还要检查一下之前的每行是否会和现在放的这个发生冲突。(不能在同一列,不能在对角线上)
这行的这列可以放,那么继续下一行。
注意这个问题用上述代码超时了,所以看一下范围,n小于等于10 ,所以采用打表的方式,算出来所有结果放在一个数组里面。