2017-03-23 1 views
0

J'ai cet extrait de code simple avec une déclaration de rupture. J'essayais de résoudre ce problème http://codeforces.com/contest/787/problem/B. Je suis venu avec cette solution:Pourquoi cette déclaration de rupture ne fonctionne-t-elle pas comme prévu?

public static void main(String[] args) { 
    FastReader in = new FastReader(); 
    int n = in.nextInt(), m = in.nextInt(); 
    HashSet<Integer> set = new HashSet<>(); 
    for(int i=0;i<m;i++){ 
     set.clear(); 
     int k = in.nextInt(); 
     boolean cancel = true; 
     for(int j=0;j<k;j++){ 
      int cur = in.nextInt(); 
      if(set.contains(-cur)){ 
       cancel = false; 
       break; 
      } 
      else set.add(cur); 
     } 
     if(cancel && k!=0){ 
      System.out.println("YES"); 
      return; 
     } 
    } 
    System.out.println("NO"); 
} 

Elle n'a pas réussi les tests, mais le moment je supprimer l'instruction break après l'annulation = false; ligne. Ça marche. Je n'arrive pas à expliquer ce qui est différent entre avoir la déclaration de rupture de sorte que lorsque la première fois que vous avez trouvé -cur intérieur, vous changiez d'annuler à false puis rompez et juste assignez false pour annuler chaque fois que vous trouvez -cur intérieur set et attendez jusqu'à la fin de la boucle et ne pas casser.

+3

L'instruction 'break' s'applique à la boucle * inner *. Et 'cancel' est faux, donc la boucle externe continue. –

Répondre

1

Lorsque vous sortez de for(int j=0;j<k;j++), vous ne lisez pas tous les numéros k de cette ligne d'entrée (sauf si vous étiez déjà au dernier numéro).

Par exemple, considérons cette entrée:

2 2 
3 -1 1 -2 
1 2 

Après avoir lu -1 et 1, vous programmez ensembles cancel à false et les pauses de la boucle intérieure. La prochaine fois à travers la boucle externe, elle lira -2 en k, et vous l'aurez foiré. Lorsque vous supprimez l'instruction break, vous lisez correctement tous les nombres et votre programme fonctionne donc correctement.

+0

Merci, je devrais l'avoir. –