2016-09-06 6 views
2

私はUberが主催したCodefightsでコーディングの課題を抱えていましたが、解決できなかった問題がありました。質問については、こちらをご覧くださいhttp://codepen.io/ducminhn/pen/JYmrmEパーキングスポットの駐車場の配列と車の寸法

この問題はダイナミックプログラミングと関係していると思いますので、この問題をダイナミックプログラミングとタグ付けしましたが、私はまだJavaを学んでいますので、間違っているかどうか教えてください。 これは私がこれまで行ってきたことですが、私のロジックがネストされたforループの中で正しくないかもしれないと私は信じています。誰かが私のコードを見直して私のために修正してください。事前に

おかげで、

boolean parkingSpot(int[] carDimensions, int[][] parkingLot, int[] luckySpot) { 

int carx = carDimensions[0]; 
int cary = carDimensions[1]; 

boolean result = false; 
for(int l=0;l<parkingLot.length;l++){ 
    for(int k=0;k<parkingLot.length;k++){ 
     if(l == luckySpot[0]){ 
      for(int i=luckySpot[0];i<carx;i++){ 
       if(k== luckySpot[1]){ 
        for(int j= luckySpot[1];j<cary;j++){ 
         if(parkingLot[i][j] != 0){ 
          result = false; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
return true; 
} 
+0

私は、これは動的計画であるとは思わない(または私は質問を誤解しています!)ではなく、単純な '合計[たくさん[0..carx +寸法[2]] [キャリーのようなもの。.. cary + dimensions [3]] == 0'となり、右からのアプローチをチェックします。 –

答えて

1

これは、それが助け場合は、あまりにもあなたが何をしたかよりも複雑なようだ...そうではありません。私は与えられた例に対してこれをテストしただけですが、問題を完全に誤解していない場合は、いくつかのループを使うことができるので、Dynamic Programmingを明白に使用することはできません。

static boolean h(int[] luckySpot,int[][] parkingLot){ 
     // check if parking spot given contains a 1 
     // (check if it's a valid parking spot) 
     for(int i=luckySpot[0];i<=luckySpot[2];i++){ 
      for(int j=luckySpot[1];j<=luckySpot[3];j++){ 
       if(parkingLot[i][j]==1) return false; 
      } 
     } 

     // check if the car parked vertically 
     if( Math.abs(luckySpot[0]-luckySpot[2]) > 
       Math.abs(luckySpot[1]-luckySpot[3])) { 

      // check for empty path going to the top 
      outerloop: 
      for(int i=0;i<luckySpot[0];i++){ 
       for(int j=luckySpot[1];j<=luckySpot[3];j++){ 
        if(parkingLot[i][j]==1) break outerloop; 
       } 
       if(i==luckySpot[0]-1) return true; 
      } 

      // check for empty path going to the bottom 
      for(int i=luckySpot[2]+1;i<parkingLot.length;i++){ 
       for(int j=luckySpot[1];j<=luckySpot[3];j++){ 
        if(parkingLot[i][j]==1) return false; 
       } 
       if(i==parkingLot.length-1) return true; 
      } 

     } 
     // the car parked horizontally 
     else{ 
      // check for empty path going to the left 
      outerloop: 
      for(int i=luckySpot[0];i<=luckySpot[2];i++){ 
       for(int j=0;j<luckySpot[1];j++){ 
        if(parkingLot[i][j]==1) break outerloop; 
       } 
       if(i==luckySpot[2]) return true; 
      } 

      // check for empty path going to the right 
      for(int i=luckySpot[0];i<=luckySpot[2];i++){ 
       for(int j=luckySpot[3]+1;j<parkingLot[0].length;j++){ 
        if(parkingLot[i][j]==1) return false; 
       } 
       if(i==luckySpot[2]) return true; 
      } 

     } 

     return false; 
    } 


    public static void main(String[] args) { 

     /* 
     "for safety reasons, the car can only move in two directions inside 
     the parking lot -- forwards or backwards along the long side of the car" 
     i assume this to mean that the direction the car travels is parallel 
     to the long side of the car 
     */ 


     int[] carDimensions = {3, 2}; 

     int [][] parkingLot = { 
       {1, 0, 1, 0, 1, 0}, 
       {1, 0, 0, 0, 1, 0}, 
       {1, 0, 0, 0, 0, 1}, 
       {1, 0, 0, 0, 1, 1} 
     }; 
     int[] luckySpot={1, 1, 2, 3}; 


     System.out.println(h(luckySpot,parkingLot)); 


    } 
+0

あなたのソースコードをありがとう、私はテストケースに対してそれを実行します。ところで、動的プログラミングとはどういう意味ですか?ダイナミックプログラミングはこのタイプの問題に役立つと思いますか?入れ子ループと動的プログラミングを使用した場合の違いは何ですか?私はそれを見ますが、私は確固たる理解を得ていませんでした。 – harrisonthu

+1

あるタイプの再帰を使用すると、すでに解決されているサブ問題が再び解決されないように動的プログラミングを明示的に使用できます。私が上でやろうとしていたのは、車の前または後ろに向かって開口部があるかどうかのチェックでした。問題が車の向きを変えることができれば(つまり直線的に直線的に移動するだけではない)、ダイナミックプログラミングの可能性があります。その時点で、再帰によって行うことができる何らかの迷路問題を解決しようとしているからです。 –

+0

私は動的プログラミングについて理解しています。正直言って、私はあなたのコードを理解するために時間を費やす必要があります。なぜなら、私はループをよく使用していないからです。とにかく、ありがとうございました! – harrisonthu

関連する問題