問題の説明
- N-クイーン問題leetcode。これは、互いに斜めできない攻撃に、垂直方向と水平方向の要件女王の間で、市松模様の女王「Q」に配置されたN * Nが必要です。
- それは、女王が限られている間の位置が表示され、です。同じ行、列にのみクイーンスラッシュで発生することができ、各行は女王を有していなければなりません。
- Nを考えると、ソリューションのすべての決定セットが繰り返されることはありません。List型の戻り値<リスト<文字列>>。
ソリューション
- それは、N * Nの正方形で、自然にDFS処理を使用するのではと思いますが、女王は、それぞれの位置のために必要いっぱい。
- 現在の位置は、クイーンズに充填することができるかどうかを決定する際に、列を決定する必要がある場所をスラッシュ、及び右対角線上の他のクイーンがあるかどうか、そこをスキップし、全く追加しません。Y =一定X +:女王は左斜めのために、公式の説明のleetcodeを決定する独創的な方法をハッチングが与えられているかどうか、直線とみなすことができます。+右斜めのと同じ、それが良いと判断することができ、横軸をつかめと、この機能の縦軸は一定です。
- まず、どこに女王を見つけるために、すべての添字インデックスの、そして最終的には各インデックスのインデックスに基づいて文字列を生成します。リスト:N = 4、最初にこの結果を得るように[1302]、[2031]]。
コード
1つの パブリック クラスソリューション{ 2 3 プライベート 静的セット<整数> COL = 新しい HashSetの<> (); 4 プライベート 静的に設定<整数>パイ= 新しい HashSetの<> (); 5 プライベート 静的に設定<整数> NA = 新しい HashSetの<> (); 6 7 パブリック 静的リスト<リストの<string >> solveNQueens(int型N){ 8 リスト<リストの<string >> RES = 新規のArrayList <> (); 9 リスト<リスト<新しいのArrayList <> (); 10 11 DFS(N、0、新規のArrayList <> ()、TEMP)。 12 のために(一覧<整数> {:TEMP) 13 のための(int型B:A){ 14 のchar [] curChar = 新しい CHAR [n]は、 15 Arrays.fill(curChar、 '' ); 16 curChar [B] = 'Q' 。 17 cur.add(新しい文字列(curChar)); 18 } 19 res.add(CUR)。 20 } 21は、 22である リターンRES。 23である 24 } 25 26である パブリック 静的 ボイド DFS(INT N-、int型の行、のArrayList <整数> curRes、リスト<リスト<整数>> RES){ 27 // 再帰終了条件 28 IF(ROW> = N- ){ 29 // res.add(curRes);宣言は再用のArrayListでない場合、再度取得したことに注意してください 30の // 以前の結果は、ArrayListのをカバーします。 31は、 32 res.add(新しい新規のArrayList <> (curRes)); 33である 34れる // ;のSystem.out.println( "=====ここでは==== DFS横断におけるRESである") 35 // (:RESリストA){ための 36 // のための(INT I = 0; I <A .size(); Iは++){ 37 // System.out.print(a.get(I))の、 38である // } 39 // のSystem.out.println(); 40 // } 41である // のSystem.out .println( "--------------------"); 42である 43が 戻り、 44である } 45 46である ため(INT I = 0、I <N - 、I ++は){ 47 // この行、すべての列はトラバース 48 のIF(col.contains(I)|| pie.contains(iは、行を+)|| na.contains(I-行)){ 続けます。} 49 50 // 符合条件:走继续 51 col.add(I)。 52 pie.add(iは+ 行)。 53 na.add(I- 行)。 54 curRes.add(I)。 55 56 DFS(N、行+ 1 、curRes、RES)。 57 58 // 回到上一层、修正 59 curRes.remove(curRes.size() - 1 )。 60 col.remove(I)。 61 pie.remove(iは+ 行)。 62 na.remove(I- 行)。 63 } 64 } 65 }
注意事項
ジェネリッククラスが存在しない場合、ArrayListのクラスのオリジナルのメソッドがオブジェクトを返すために選択の余地を提供していない取得では、そのため、呼び出し側入手方法は、戻り値を型キャストしなければなりません。
それは何を意味するのでしょうか?次のコードを見てください
1 リスト<リスト<Integer型>>テスト= 新しい ArrayListを<> (); 2 一覧<整数> A = 新規のArrayList <> (); 3 a.add(1 )。 4 a.add(2 )。 5 6 一覧<整数> B = 新規のArrayList <> (); 7 b.add(4 )。 8 b.add(5 )。 9 b.add(6 )。 10 11 test.add(A)。 12 test.add(B)。 13 14 のために(リストE:試験){ 図15は、 のために(オブジェクトO:E){ 16 // これはなぜタイプオブジェクトでありますか???時間は、ステートメントはInteger型であるが、一般的なクラスE宣言していないが、 17を // ジェネリッククラスが存在しない場合には、ArrayListクラスに戻り、元のメソッドは、Object型で提供することができます、取得メソッド呼び出しが値を返す必要があります型変換。 18である のSystem.out.println((INT )O); 19 } 20である のSystem.out.println( "------" ); 21です }
ジェネリッククラスを宣言し、それを解決する方法
1 のための(一覧<整数> E:テスト){ 2 ための(int型O:E){ 3 のSystem.out.println(O) 4 } 5 のSystem.out.println( "------" )。 6 }