Sprechen Sie über n Königin

Platziere n Königinnen auf einem n * n Schachbrett und benötige dieselbe Zeile und dieselbe Spalte. Zwei Schrägstriche können nicht platziert werden.
Dies ist ein einfaches Backtracking-Problem.
Es ist jedoch schwierig zu beurteilen, ob es veröffentlicht werden kann.


Zu dieser Zeit dachte ich darüber nach, ein zweidimensionales Array zu öffnen, um zu beurteilen, ob diese Koordinate gesetzt werden kann.
Aber hier gibt es ein Problem. Die Schrägstriche von zwei Königinnen (1 und 2) können den Fokus haben. Dann werden wir diese Koordinate zurücksetzen, wenn wir zurückgehen (zurück von Königin 2). Aber in diesem Fall hat der Schrägstrich von Königin 1 keine Wirkung.


Die Königin wird aus der 0. Reihe platziert und es kann nur eine Königin in einer Reihe geben, so dass die i-te Königin auch die i-te Reihe ist.
Verwenden Sie zur Darstellung ein Array-Flag. flag[i]=jDies zeigt an, dass die Königin in Zeile i in Spalte j platziert ist.
Auf diese Weise können Sie unter Berücksichtigung der diagonalen Linie die Steigung der Zweipunkt-Geraden (Y1-Y2 / X1-X2) verwenden.

#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;
}
Veröffentlicht 161 Originalartikel · Gefällt mir 68 · Besucher 20.000+

Ich denke du magst

Origin blog.csdn.net/qq_43179428/article/details/105340933
Empfohlen
Rangfolge