2016-09-06 1 views
2

Je faisais les défis de codage sur Codefights, sponsorisés par Uber et il y avait un problème que j'étais incapable de résoudre. Pour la question, vous pouvez regarder ici http://codepen.io/ducminhn/pen/JYmrmE.Stationnement Station de stationnement avec fonction de tableau de bord et dimension de la voiture

Je crois que ce problème est lié à la programmation dynamique, donc j'ai étiqueté ce problème comme la programmation dynamique, mais j'apprends toujours Java, alors s'il vous plaît informez-moi si je me trompe. C'est ce que j'ai jusqu'ici, et je crois que ma logique peut ne pas être correcte dans la boucle for imbriquée. Si quelqu'un pouvait vérifier mon code et le corriger pour moi.

Merci à l'avance,

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

Je ne pense pas que ce soit la programmation dynamique (ou je suis mal compris la question!), Mais plutôt quelque chose comme une simple somme '[lot [+ 0..carx dimensions [2]] [cary .. cary + dimensions [3]] == 0' et similaire pour vérifier l'approche à partir de la droite. –

Répondre

1

Cela semble plus compliqué que ce que vous avez fait ... donc pas trop sûr si ça aide. Je l'ai juste testé par rapport aux exemples donnés mais si je ne comprends pas complètement le problème, vous pouvez simplement utiliser quelques boucles, donc il n'y a pas d'utilisation évidente de la programmation dynamique.

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

Merci pour votre code source, je vais l'exécuter contre les cas de test. Au fait, que signifie la programmation dynamique? Je suppose que la programmation dynamique est utile dans ce type de problèmes? Quelle est la différence btw en utilisant des boucles imbriquées vs la programmation dynamique. Je le regarde, mais je n'ai pas compris. – harrisonthu

+1

Une utilisation explicite de la programmation dynamique est possible lors de l'utilisation d'un type de récursion de sorte que les sous-problèmes qui ont déjà été résolus ne sont pas résolus à nouveau. Tout ce que j'essayais de faire était de vérifier s'il y avait une ouverture vers l'avant ou l'arrière de la voiture. Si le problème permettait à la voiture de tourner (c'est-à-dire de ne pas se déplacer directement), il est possible d'utiliser la programmation dynamique car à ce stade, vous essayez de résoudre un problème de labyrinthe qui peut être résolu par récursivité. –

+0

Je comprends la programmation dynamique. Honnêtement, je dois passer du temps à comprendre votre code car je ne suis pas très doué pour l'utilisation des boucles. En tout cas, merci pour votre aide! – harrisonthu