2016-09-06 3 views
2

Я делал проблемы с кодированием в Codefights, спонсируемый Uber, и возникла проблема, которую я не смог решить. На этот вопрос вы можете посмотреть здесь http://codepen.io/ducminhn/pen/JYmrmE.Функция парковочного места, заданная для паркинга, и размер автомобиля

Я считаю, что эта проблема связана с динамическим программированием, поэтому я отметил эту проблему как динамическое программирование, но я все еще изучаю Java, поэтому, пожалуйста, сообщите мне, если я ошибаюсь. Это то, что у меня есть до сих пор, и я считаю, что моя логика может быть неправильной внутри цикла вложенных циклов. Если кто-то может рассмотреть мой код и исправить его для меня.

Спасибо заранее,

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 .. cary + размеры [3]] == 0' и аналогичные для проверки подхода справа. –

ответ

1

Это кажется более сложным, чем то, что вы сделали ... так что не слишком уверен, если это помогает. Я просто тестировал его против данных примеров, но если я не полностью недопонимаю проблему, вы можете просто использовать пару циклов, поэтому нет очевидного использования динамического программирования.

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

 Смежные вопросы

  • Нет связанных вопросов^_^