Поговорим о русской королеве

Поместите 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;
}
Опубликовано 161 оригинальных статей · Нравится 68 · Посетителей 20 000+

рекомендация

отblog.csdn.net/qq_43179428/article/details/105340933
рекомендация