2009-02-08 9 views
0

Je m'entraîne pour une compétition (c'est de là que provient my previous question). J'ai obtenu l'algorithme pour la question, mais j'ai quelques problèmes avec la programmation actuelle. C'est une compétition en solo, donc j'ai vraiment besoin d'être réglé avant d'y aller. Ceci est la question.Lecture dans les tableaux en C++

Tâche 3: GECKO Pendant la saison des pluies, l'un des murs de la maison est infestée de moustiques . Le mur est couvert par h × w carreaux carrés, où il y a h rangées de carreaux de haut à en bas, et w colonnes de carreaux de gauche à droite. Chaque tuile a 1 à 1000 moustiques qui s'y reposent. Un gecko veut manger autant de moustiques que possible, sous réserve des restrictions suivantes. Il commence par choisir n'importe quelle tuile dans la rangée supérieure, et mange les moustiques dans cette tuile. Ensuite, il se déplace vers une tuile dans la rangée inférieure suivante, mange les moustiques sur la tuile, et ainsi de suite jusqu'à ce qu'il atteigne le sol. Lorsque il passe d'une tuile à une tuile en la rangée inférieure suivante, il peut seulement déplacer verticalement vers le bas ou en diagonale vers à gauche ou à droite (voir Figure 1). Étant donné les valeurs de h et w, et le nombre de moustiques reposant sur chaque tuile, écrire un programme pour calculer le nombre maximum possible des moustiques les gecko peuvent manger en un seul voyage de haut en bas de le mur.

Un fichier d'entrée exemple serait:
Exemple

Le problème que je vois est en lecture en t Il numérote (ou le haut de la liste des problèmes). Mon code actuel pour la lecture en est:

ifstream read; 
read.open("input.txt"); 
write.open("output.txt"); 
int width, height, wall[500][500]; 
read >> height; 
read >> width; 
for (int count1 = 0; count1 < height; count1++) 
{ 
    for (int count2 = 0; count2 < width; count2++) 
     { 
     read >> wall[count1][count2]; 
     } 
} 

Quand je l'ai testé avec un cout d'imprimer tous les numéros lus, tout ce que je suis arrivé était charabia. À l'heure actuelle, je ne peux pas repérer d'erreurs, quelqu'un peut-il voir le problème? Merci. (corrigé) Merci encore.

J'ai testé la lecture et c'est parfait maintenant. Cependant, le nombre de mouches que je reçois est toujours éteint. Par exemple l'entrée
Doit donner la sortie 23, mais je reçois 0 comme sortie. Voici mon code:

int h = 0, w = 0, compare1, compare2, compare3, currentInt; 
for (int count3=(height-2); count3 >= 0; count3--) 
{ 
    for(int count4 = 0; count4 < width; count4++) 
    { 
    h = count3; 
    w = count4; 
     currentInt = wall[h][w]; // read in affected integers. 
     if(w != 0) 
     { compare1 = wall[h+1][w-1]; 
     } 
     compare2 = wall[h+1][w]; 
     compare3 = wall[h+1][w+1]; 
     if(w!= 0)      // Compare and replace. 
     { 
      if(((currentInt + compare1) >=(currentInt + compare2)) && ((currentInt + compare1)>=(currentInt + compare3))) 
      { 
      wall[h][w] = (currentInt+compare1); 
      } 
      if(((currentInt + compare2) >(currentInt + compare1)) && ((currentInt + compare2)>(currentInt + compare3))) 
      { 
      wall[h][w] = (currentInt+compare2); 
      } 
      if(((currentInt + compare3) >=(currentInt + compare2)) && ((currentInt + compare1)>(currentInt + compare1))) 
      { 
      wall[h][w] = (currentInt + compare3); 
      } 
     } 
     else 
     { 
      if ((currentInt + compare2) >= (currentInt + compare3)) 
      { 
      wall[h][w] = (currentInt + compare2); 
      } 
      else 
      { 
      wall[h][w] = (currentInt + compare3); 
      } 
     } 
     } 
} 
int maxFlies=0; 
for (int count5 = 1; count5 < width;count5++) 
    { 
    maxFlies = wall[0][0] ; 
    if (maxFlies < wall[0][count5]) 
    { maxFlies = wall[0][count5] ; } 
    } 
write<<maxFlies<<endl; 
read.close(); 
write.close(); 
return 0; 

Ce que je suis en train de faire avec qui est essentiellement: rechargées depuis la dernière ligne. Ajoutez-le avec les seuls blocs qu'il peut atteindre ci-dessous.Ensuite, déplacez-vous et enfin, testez celui de la ligne supérieure qui est le plus grand entier. Merci pour les réponses rapides.

+0

Non directement lié à votre question, mais essayez de lire votre mur, carte ou autre dans les index (1,1) et au-delà, en laissant une bordure autour de votre mur ou de la carte.Si vous le manipulez correctement, il Par exemple, vous n'aurez pas besoin de vérifier les index en regardant les diagonales –

+0

Ahh ok ok merci, je vais devoir initialiser toutes les positions t o 0 au début mais wouldnt je? La chose est que nous avons un temps d'exécution maximum. Si je ne me trompe pas 1 ou 2 secondes. – Nekolux

+0

Le temps d'exécution ne sera pas un problème tant que vous choisissez le bon algorithme. Même ainsi, vous économiserez au moins deux vérifications d'index chaque fois que vous voulez choisir une tuile par rapport à l'autre. Ceci est susceptible d'améliorer votre temps d'exécution. Et rappelez-vous, dans les concours, le temps de codage est beaucoup plus important que le temps d'exécution. –

Répondre

1

Les tableaux 2D ne sont pas accessibles en tant que tableau [alpha, bêta] en C++.

Il est fait comme Array [alpha] [beta].

0

Votre boucle commence par

for (int count3=(height-2); count3 >= 0; count3--) 
{ 
    .... 
} 

Si votre entrée est un tableau 1x1 puis (hauteur-2) == -1 si la boucle ne sera jamais exécuter (puisque la condition (count3> = 0) sera