刚学回溯算法的时候就听说了八皇后问题,一直没有机会写,今天动手写了写,一开始想着用二维数组,一个个遍历,后来改了自己的二维数组的方法改了大半个晚上还是不行。
网上找了找,发现一个很简洁的方法,大概思路就是用一个数组装下每一行的皇后放置的列下标,之后判断是否和前面的皇后位置有冲突,有冲突的话就回溯,没冲突则继续到下一行(层),数组长度达到8时,计数器加一,并且回到上一层,之后回溯,继续循环,尝试该行的下一列是否能够放置皇后,以此类推。
下面贴代码:
# include<iostream>
# include<cstring>
# include<vector>
# include<cmath>
using namespace std;
int num=0;
bool check(vector<int> &path){
int n=path.size()-1;//最后插入的那一行皇后的数组下标
for(int i=0;i<path.size();i++){
if(i==n)continue;//避免同一行的皇后自己和自己比较
if((abs(path[i]-path[n])==n-i)||(path[i]==path[n]))
return false;//只需要判断斜线和列,因为行(层)是不同的。
}
return true;
}
void trackback(vector<int> &path,int &count){
if(path.size()>=8){
count++;
return;
}
for(int i=0;i<8;i++){
path.push_back(i);
if(check(path)){
trackback(path,count);
}
path.pop_back();
}
}
int main(){
vector<int> path;
int count=0;
trackback(path,count);
cout<<count;
return 0;
}