Поместите n ферзей на n * n шахматную доску, требуя одинаковую строку и один и тот же столбец. Невозможно поместить две косые черты.
Это простая проблема возврата.
Но как судить, можно ли его выпустить, сложно.
В то время я думал об открытии двумерного массива, чтобы судить, можно ли поставить эту координату.
Но здесь есть проблема: косые черты двух ферзей (1 и 2) могут иметь фокус. Затем мы сбросим эту координату при возврате (возврат от ферзя 2). Но в этом случае косая черта 1 не имеет никакого эффекта.
Королева находится в 0-й строке, и в ней может быть только одна королева, поэтому i-я королева также является i-й строкой.
Используйте флаг массива для представления. flag[i]=j
Это указывает на то, что королева в строке i находится в столбце j.
Таким образом, при рассмотрении диагональной линии вы можете использовать наклон двухточечной прямой (Y1-Y2 / X1-X2).
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int ans=0;
int flag[100];//flag[i]=j, 第i个皇后的列数j
bool place(int col,int row){
for(int i=0;i<row;i++){ //找出已经放置的queen的行,判断他们与将要放的queen是否冲突
if(flag[i]==col||abs(i-row)==abs(col-flag[i])) return false;
}
return true;
}
void dfs(int n,int row){
if(row==n){
ans++;
return;
}
for(int i=0;i<n;i++){//列数
if(place(i,row)){//判断第row行,第i列可不可以放queen
flag[row]=i;
dfs(n,row+1);
//flag[row]=0;
//发现去掉这里也没事,原因:我们先判断再放,所以回溯也没事。
}
}
}
int main(void){
int n=4;
dfs(n,0);
cout<<ans;
}