2015-02-14 3 views
1

Моя программа использует StdDraw для создания сетки N-by-N. Я должен принимать N и T в командной строке (N - количество строк в сетке, T - количество раз, когда я могу попытаться избежать сетки в случайном блуждании). Я получаю сообщение об ошибке, которая говорит:Проблемы с булевым массивом в программе самообвинения в случайной прогулке?

Exception in thread "main" java.lang.NegativeArraySizeException 
at RandomWalk.main(RandomWalk.java:28) 

Моя программа выглядит следующим образом:

import java.util.Random; 
    public class RandomWalk { 
     public static void main(String[] args) { 
      int N = Integer.parseInt(args[0]); 
      int T = Integer.parseInt(args[1]); 
      int tempN = N; 
      int DEcount = 0; //Dead End Count 
      int x0 = N/2; 
      int y0 = N/2; 
      int x1 = x0; 
      int y1 = y0; 
      StdDraw.setXscale(0.0, N); 
      StdDraw.setYscale(0.0, N); 
      StdDraw.setPenColor(StdDraw.GRAY); 
      StdDraw.setPenRadius(0.002); 
      while (N >= 0) { 
       StdDraw.line(tempN, N, 0, N); 
       N--; 
      } 
      StdDraw.setPenColor(StdDraw.GRAY); 
      StdDraw.setPenRadius(0.002); 
      N = tempN; 
      while (N >= 0) { 
       StdDraw.line(N, tempN, N, 0); 
       N--; 
      } 
      for (int i = 0; i < T; i++) { 
       boolean[][] check = new boolean[N][N]; 
       while (x1 > 0 && x1 < N-1 && y1 > 0 && y1 < N-1) { 
        //check for dead ends and make a random move 
        check[x1][y1] = true; 
        if (check[x1-1][y1] && check[x1+1][y1] && check[x1][y1-1] && check[x1][y1+1]) { 
       DEcount++; 
       break; 
      } 
      double rand = Math.random(); 
      if  (rand < 0.25) { if (!check[x1+1][y1]) x1++;} 
      else if (rand < 0.50) { if (!check[x1-1][y1]) x1--;} 
      else if (rand < 0.75) { if (!check[x1][y1+1]) y1++;} 
      else if (rand < 1.00) { if (!check[x1][y1-1]) y1--;} 

      StdDraw.setPenColor(StdDraw.RED); 
      StdDraw.setPenRadius(0.01); 
      StdDraw.line(x0, y0, x1, y1); 
      x0 = x1; 
      y0 = y1; 
      } 
     } 
    } 
} 

Кроме того, что я должен быть печать на сетке (красные линии, которые представляют собой случайное блуждание) не печатаются. Однако сама сетка печатает.

Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно?

Справка приветствуется.

ответ

1

Рассмотрим этот фрагмент кода:

 while (N >= 0) { 
      StdDraw.line(N, tempN, N, 0); 
      N--; 
     } 
     for (int i = 0; i < T; i++) { 
      boolean[][] check = new boolean[N][N]; 

В конце цикла в то время, N равен -1, а затем использовать его в качестве размера массива.

Возможно, вы использовали tempN, который, как представляется, сохраняет N. Я предлагаю более описательные имена, чтобы избежать такой проблемы.

0
  • вопрос 1: Внутри вашего цикла в то время как вы уменьшаете переменную N до ее -1. его следующее использование является спецификатором размера массива при распределении check. Я думаю, вы забыли другое задание N = tempN непосредственно перед циклом for.
+0

Извините, неправильный анализ для выпуска 2. – collapsar