2016-09-23 3 views
-3

Hier ist ein Code von einem meiner Programmierwettbewerb, es ist chaotisch und ich habe nichts geändert. Zeige dir einfach das Wunder.Miracle Java Impossible Code?

MainClass.java

import java.util.*; 

public class MainClass { 

    private static Scanner scan = new Scanner(System.in); 
    private static Scanner scanText = new Scanner(System.in); 

    private static int[][] list; 
    private static int row, col; 

    private static int lazyCode = 0; 

    public static void main(String[] args) { 

     col = scan.nextInt(); 
     row = scan.nextInt(); 

     list = new int[row][col]; 
     for (int i = 0; i < row; ++i) { 
      for (int j = 0; j < col; ++j) { 
       list[i][j] = 0; 
      } 
     } 

     ArrayList<ArrayList<Point>> lazyList = new ArrayList<ArrayList<Point>>(); 

     String line = scanText.nextLine(); 
     Scanner temp_scan = new Scanner(line).useDelimiter(","); 

     while (temp_scan.hasNext()) { 

      String str = temp_scan.next().toString(); 

      char isLazy = str.charAt(str.length() - 1); 

      if (isLazy == '*') { 

       lazyList.add(new ArrayList<Point>()); 
       Point p = findNextSeat(); 

       int lc = lazyCode; 
       list[p.r][p.c] = lc + 10; 
       lazyList.get(lc).add(p); 
       lazyCode++; 

      } else { 

       char character = str.charAt(0); 
       int temp = character - 65; 
       int temp2 = Integer.parseInt(str.substring(1)) - 1; 
       System.out.println();// ------------------------BreakPointHere 
       int x = list[temp][temp2];// ------------------------BreakPointHere 
       System.out.println();// ------------------------BreakPointHere 
       if (x == 0) { 
        list[temp][temp2] = 1; 
       } else { 
        Point p = findNextSeat(); 

        int lc = list[temp][temp2] - 10; 
        list[temp][temp2] = 1; 
        list[p.r][p.c] = lc + 10; 
        lazyList.get(lc).add(p); 
       } 
      } 
     } 

     for (int i = 0; i < lazyList.size(); ++i) { 
      for (int j = 0; j < lazyList.get(i).size(); ++j) { 
       Point p1 = lazyList.get(i).get(j); 
       char c1 = (char) (p1.c + 65); 
       if (i == lazyList.size() - 1 && j == lazyList.get(i).size() - 1) { 
        System.out.print(c1 + p1.r + ","); 
       } else { 
        System.out.print(c1 + p1.r); 
       } 
      } 
      System.out.println(); 
     } 
    } 

    private static class Point { 
     Point(int i1, int i2) { 
      r = i1; 
      c = i2; 
     } 
     int r; 
     int c; 
    } 

    private static Point findNextSeat() { 
     for (int r = 0; r < row; ++r) { 
      for (int c = 0; c < col; ++c) { 

       if (list[r][c] == 0) { 
        return new Point(r, c); 
       } 
      } 
     } 
     return null; 
    } 

} 

Input:

A1, A4, A6, B1

Hinweis: Für die Eingabe, kann ich nicht geben Sie die tatsächliche Eingabe aus dem Wettbewerb, weil sie uns nicht erlauben, es zu tun, so gebe ich nur einige gearbeitete Eingabe.

In Eclipse, Sehen Sie meinen "BreakPoint", brechen Sie an diesen Zeilen, und debuggen Sie es, iterate ist in Ordnung. ABER IM ZWEITEN ITER, WÜRDE DIE ZWEITE LINIE DES BREAKPUNKTES ZWEIMAL LAUFEN !!! ZWEIMAL!!! UND DANN DIE AUSNAHME. Ja, der mittlere Code würde zweimal laufen !!! Und ich arbeite an diesem unglaublichen Problem für den gesamten Wettbewerb. Ich habe für 7 Jahre programmiert, es ist das erste Mal in meinem Leben, so einen großen epischen unbekannten Bug zu sehen.

+0

Es ist ein Wettbewerb, so der Code vielleicht chaotisch und unlesbar, aber nur darauf achten, dass Bug! Ich benutze Eclipse Luna mit jdk1.8. – TheSixteenthX

+4

Es ist überhaupt nicht klar, was Sie mit "Die zweite Zeile der Break Point würde zweimal laufen". Es in Kappen zu stecken, macht es nicht klarer, es sieht nur so aus, als würdest du schreien. Bitte formatieren Sie den Code richtig, verdeutlichen Sie den Code und reduzieren Sie ihn idealerweise auf [mcve]. Erläutern Sie außerdem, ob dies nur das Verhalten ist, das im Eclipse-Debugger angezeigt wird, oder ob eine unerwartete Ausgabe vorliegt. –

+0

Gibt es hier eine Frage? –

Antwort

0

Sie haben sicherlich die Option Ausführung Suspend auf abgefangene Ausnahmen in Fenstern> Einstellungen> Java> Debug aktiviert, so dass der Debugger stoppt zweimal auf Ihrer Linie: einmal wegen des Breakpoint, einmal wegen der ArrayIndexOutOfBoundsException.

+0

Millionen von Dank. Sie haben Recht, das ist das Problem von "Debugger Setting". Ich beende diese Frage innerhalb von 30 Minuten, und die verbleibenden 2 Stunden 30 Minuten sind Arbeit an diesem "Debugger-Problem". – TheSixteenthX