グリッドとしてモデリング部屋にロボット掃除機を考えます。 グリッド内の各セルは空またはブロックすることができます。 ロボット掃除機 4つの与えられたAPIは、前進右左折することができます。それぞれのは、それが90で作られたターン度。 それがブロックされたセルに移動しようとすると、そのバンパーセンサーが障害物を検知し、それが現在のセルの上にとどまります。 のみ使用して部屋全体を掃除するためのアルゴリズム設計 4つの、以下に示す特定のAPIを。 インタフェースロボット{ // 次のセルが開いていて、ロボットがセルに移動した場合に真を返します。 // 次のセルが障害物とロボット現在のセルの上にとどまるの場合はfalseを返します。 ブール移動(); //ロボットはturnLeft / turnRightを呼び出した後に同じセルに滞在します。 // 各ターンは90度になります。 無効turnLeftを(); 空turnRight(); // 現在のセルを清掃してください。 無効クリーン(); } 例: 入力: ルーム = [ [ 1,1,1,1,1,0,1,1 ]、 [ 1,1,1,1,1,0,1,1 ]、 [ 1,0,1 、1,1,1,1,1 ]、 [ 0,0,0,1,0,0,0,0 ]、 [ 1,1,1,1,1,1,1,1 ] ]、 行 = 1 、 COL = 3 説明: 部屋のすべてのグリッドは、いずれかの方法でマークされている 0または1 。 0は、セルがブロックされることを意味しながら 1 セルがアクセス可能であることを意味します。 ロボットは、最初の行の位置で開始 = 1、COL = 3 。 左上隅から、その位置は、以下1行3列右にあります。 注: 入力のみの部屋とロボット初期化するために与えられている内部の位置を。あなたは「目隠し」この問題を解決しなければなりません。言い換えれば、あなたは部屋のレイアウトと初期ロボット」知らなくても、唯一の言及4つのAPIを使用してロボットを制御しなければならない立場を。 ロボットの初期位置は常にアクセスセルになります。 ロボットの初期方向が上向きされます。 すべてのアクセスの細胞はとしてマークされたすべてのセルを意味し、接続されている 1は、ロボットによってアクセスできるようになります。 グリッドのすべての4つのエッジがすべての壁で囲まれていると仮定します。
- ロボットは掃除している細胞を追跡するために、(0、0)からインデックス対(i、j)を開始します。、I-1を上がるとき。I + 1、ダウンしました。左、J-1に行きます。右に行く:J + 1。
- また、ロボットの現在の向きを記録するために矢印を使用します。=矢印DIRSアレイへと4%相当(+矢印1)
1 / ** 2 * //これは、ロボットの制御インタフェースです。 3 * //あなたはそれを実装、またはその実装について推測するべきではありません 4 *インタフェースロボット{ 5 前のセルが開いており、ロボットが細胞内に移動した場合* // trueを返します。 6 * //前のセルがブロックされ、ロボットが現在のセルに留まっている場合はfalseを返します。 7 *パブリックブール移動(); 8 * 9 * //ロボットはturnLeft / turnRightを呼び出した後、同じセル内に留まります。 10 * //各ターンは90度になります。 11 *ます。public void turnLeft(); 12 *ます。public void turnRight(); 13 * 14 * //現在のセルを清掃してください。 15 クリーン*ます。public void(); 16 *} 17 * / 18 クラスソリューション{ 19 公共 ボイドクリーンルーム(ロボットロボット){ 20 HashSetの<ストリング>訪問= 新しい HashSetの<> (); 21の DFS(ロボット、訪問、0、0、0 ); 22 } 23 24 のint [] [] DIRS = 新しい INT [] [] {{1,0}、{0,1}、{-1、0}、{0、-1 }}。 25 26 公衆 空 DFS(ロボットロボット、HashSetの<文字列>は、訪問したint型 I、int型 J、INT {矢印) 27 であれば(visited.contains(I + " - " + J))のリターンを。 28 visited.add(I + " - " + J)。 29 robot.clean()。 30 31 のために(int型のk = 0; K <4; ++ k個){ 32 //は移動できないまで、すべての道を行く戻っワンステップ 33 であれば(robot.move()){ // このチェックであれば次のセルはい、それは内を移動する場合は、okですすでに 34 int型私は+ newX = dirsの[矢印] [0];// これは、すでにそこに、次のセル位置である 35 INT newY = J + DIRS [矢印] [1 ]。 36の DFS(ロボット、訪問、newX、newY、矢印)。 37 38 // バックトラック:逆に、最後の位置に戻る 39 robot.turnLeft(); 40 robot.turnLeft()。 41 robot.move()。 42 robot.turnRight()。 43 robot.turnRight()。 44 } 45 robot.turnRight()。 46 矢印= 4%(+矢印1) 。 47 } 48 } 49 }