-52の特別なバックトラックLeetcode。NクイーンII(N-クイーンズII)
80%質問51でコードが、具体的なソリューションを求めている、請求項52、51中の溶液の数と同様に、51にクリック
クラスソリューション{ INT ANS = 0 。 公共 INT totalNQueens(int型N){ チャー MP [] [] = 新しい CHAR [n]は[N]。 用(int型 ; iがN <I ++はiが0 = {) のために(INT J = 0; J <nであり、j ++ ){ MP [I] [J] '' = ; } } DFS(MP、nは、 0、0 ); 戻るANSを。 } 公共 ボイド DFS(CHAR [] []融点、INTLEN、int型、中INT クイーン)は{ INT X = I / LEN。 INT Y =で%LEN。 もし((X> = LEN || Y> = LEN)){ 場合(!クイーン= LEN) のリターン; ANS ++ ; 返します。 } のDFS(MP、LEN、で + 1 、クイーン)。 もし(OK(MP、LEN、X、Y)){ MP [X] [Y] = 'Q' 。 DFS(MPで、LEN、 + 1、クイーン+ 1 )。 MP [X] [Y]= '' ; } } パブリック ブール OKは、(CHAR [] [] MP、INT LEN、int型のx、int型のY){ // 行をチェック するために(int型 i = 0; iがLEN <; Iは++ ){ 場合(I == y)を 続けます。 もし(MP [X] [i]を== 'Q' ) を返す 偽。 } // COLをチェック するために(int型 i = 0; iがLEN <; iは++ ){ もし(I == x)を 続けます。 もし(MP [I] [Y]は== 'Q' ) を返す 偽。 } // X = 1、Y = 3 のint CNT = 0 。 int型アップ= 0 ; int型ダウン= 0 ; 用(int型 I = Y + 1、iがLEN <; iは++ ){ アップ =(++ CNT)* -1 + X。 ダウン = CNT * 1 + X。 もし(アップ<LEN &&アップ> = 0 ){ //System.out.println( "MP [最大] [I] = [" +アップ+ "] [" + I + "]"); もし(MP [アップ] [i]を== 'Q' ) を返す 偽。 } であれば(ダウン> = 0 &&ダウン< LEN){ // するSystem.out.println( "MP [DOWN] [I] = [" +ダウン+ "] [" + I + "]"); 場合(MPは、[DOWN] [I] == 'Q' ){ 戻り 偽。 } } } // するSystem.out.println( "その他")。 CNT = 0 ; 以下のために(int型 iは、Y = - 1; I> = 0。=(++ CNT)* -1 + X。 ダウン = CNT * 1 + X。 もし(アップ<LEN &&アップ> = 0 ){ // するSystem.out.println( "MP [最大] [I] = [" +アップ+ "] [" + I + "]"); もし(MP [アップ] [i]を== 'Q' ) を返す 偽。 } であれば(ダウン> = 0 &&ダウン< LEN){ // するSystem.out.println( "MP [DOWN] [I] = [" +ダウン+ "] [" + I + "]"); 場合(MPは、[DOWN] [I] == 'Q' ){ 戻り 偽。 ; } }