スタックと再帰的に問題、この時間
`` `
クラスのソリューション{
パブリック:
int型ANS = 0;
INT [100] [100]。
int型メートル。
INT X [100005]。
INTのY [100005]。
int型S [100005]。
int型のp [100005]。
INT totalNQueens(int型N){
M = N。
memset(0、はsizeof(a)参照)。
int型POS = 0;
S [POS] = 0;
X [POS] = - 1。
Y [POS] = - 1。
P [POS] = - 1。
POS ++;
ながら(!POS = 0)
{
int型I = sの[POS-1]。
IF(I == N)
{
ANS ++。
}
もし(P [POS-1] <= N-1 && I = N!)
{
P [POS-1] ++;
一方、(![I] [P [POS-1]] = 0)
{
P [POS-1] ++;
}
もし(P [POS-1] = N!){
[I] [P [POS-1] = 1。
setLock(I、P [POS-1]、2)。
S [POS] = I + 1。
X [POS] = I。
Y [POS] = P [POS-1]。
P [POS] = - 1。
POS ++;
持続する;
}
}
もし(POS == 1)
ブレーク。
[X [POS-1]] [Y [POS-1]] = 0;
setLock(X [POS-1]、Y [POS-1]、 - 2)。
pos--;
}
戻りANS。
}
ボイドsetLock(int型のx、int型のY、int型NUM)
{
(INT I = X + 1、iがm <; iは++)のために
{
[i]を[Y] + = NUM。
}
INTタグ= 1。
以下のために(INT I = X + 1、iがm <; iは++)
{
IF(Y +タグ<M)
[i]を[Y +タグ] + = NUM。
もし(Y-タグ> = 0)
[i]を[Y-タグ] + = NUM。
タグ++;
}
}
}。
`` `