0

When i tried running this code I get this error..I dont know where i went wrong..I am searching for a long time on net. But no use. Please help or try to give some ideas how to achieve this.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10000 at Percolation.isOpen(Percolation.java:47) at Percolation.open(Percolation.java:39) at Percolation.isFull(Percolation.java:178) at Percolation.percolates(Percolation.java:207) at Percolation.creList(Percolation.java:75) at Percolation.isFull(Percolation.java:173) at Percolation.percolates(Percolation.java:207) at Percolation.percolates(Percolation.java:207) at Percolation.creList(Percolation.java:75) at Percolation.isFull(Percolation.java:173) at Percolation.percolates(Percolation.java:207) at Percolation.percolates(Percolation.java:207) at Percolation.percolates(Percolation.java:216) at Percolation.creList(Percolation.java:75) at Percolation.isFull(Percolation.java:173) at Percolation.percolates(Percolation.java:207) at Percolation.creList(Percolation.java:75) at Percolation.isFull(Percolation.java:173) at Percolation.percolates(Percolation.java:207) at Percolation.percolates(Percolation.java:207) at Percolation.creList(Percolation.java:75) at Percolation.isFull(Percolation.java:173) at Percolation.percolates(Percolation.java:207) at Percolation.percolates(Percolation.java:216) at Percolation.main(Percolation.java:235)

import java.util.Random;

public class Percolation {
     private int[][] grid;
     private int[][] parent;  
     private int[][] root;
     private int[][] List;
     private static int[] list;
     int count=0;

//create n-by-n grid, with all sites blocked
     public Percolation(int n){
      parent = new int[n][n];
      for (int i = 0; i < n; i++) {
          for (int j=0;j<n;j++){
              parent[i][j] = j+n*i;}
      }
      root= new int[n][n];
      for (int i=0;i<n;i++) { 
          for (int j=0;j<n;j++){
             root[i][j]=10000; }  
      }
      grid=new int[n][n];
      for (int i=0;i<n;i++) { 
          for (int j=0;j<n;j++){
             grid[i][j]=0; }     //let zero represent blocked,one represent open
           } 
      List=new int[2][n*n];
      for (int i=0;i<2;i++) { 
          for (int j=0;j<n*n;j++){
             List[i][j]=10000; }     //let zero represent blocked,one represent open
           } 


     }  ;    

//open site (i, j) if it is not open already
     public void open(int i, int j){
        if(!isOpen(i,j)){
            grid[i][j]=1;
            root[i][j]=parent[i][j];
        };   
     }  ;  

//is site (i, j) open?   
     public boolean isOpen(int i, int j){
         return  (grid[i][j]==1);                                        
     }  ;  

     public int  creI() {
         java.util.Random random=new java.util.Random();
         int i=random.nextInt(grid.length);
         return i;
    }

     public int  creJ() {
         java.util.Random random=new java.util.Random();
         int j=random.nextInt(grid.length);
         return j;
    }

     public  int[][] creList(int i,int j) { 
        if(count<grid.length*grid.length){              
            int count1=0;
            while(List[0][count1]!=i||List[1][count1]!=j){
                if(count1<count+1){
                    count1++;
                };
                if(count1==count+1){
                    List[0][count1-1]=i;
                    List[1][count1-1]=j;
                    break;
                };  
            }
            if(List[0][count1]==i&&List[1][count1]==j){percolates();}

            count ++;
        }
        return List;

    }

//validate that i and j  is a valid index
        @SuppressWarnings("finally")
        private boolean validate(int i, int j) {
            int n = grid.length;
            try{
                if(i<0||i>= n||j<0||j>=n);
                }
            catch(Exception e){
                throw new java.lang.IllegalArgumentException("java.lang.IllegalArgumentException");
                }
            finally{
                return (i<0 || i>=n || j<0 || j>=n );
            }                               
        }



        public void find(int i,int j){
//            if (grid[i][j]==1){
                 while(!validate(i-1,j)){
                  if(grid[i-1][j]==1&& i-1>=0){
                   int a=Math.min(parent[i][j], parent[i-1][j]);
                   parent[i][j]=a;
                   parent[i-1][j]=a;
                   root[i][j]=a;
                   root[i-1][j]=a;
                  };
                  break;
                 };
                 while(!validate(i,j-1)){
                  if(grid[i][j-1]==1&& j-1>=0){
                   int b=Math.min(parent[i][j], parent[i][j-1]);
                   parent[i][j]=b;
                   parent[i][j-1]=b; 
                   root[i][j]=b;
                   root[i][j-1]=b;                    
                  };
                  break;
                 }
                 while(!validate(i,j+1)){
                  if(grid[i][j+1]==1 && j+1<grid.length){
                   int c=Math.min(parent[i][j], parent[i][j+1]);
                   parent[i][j]=c;
                   parent[i][j+1]=c;
                   root[i][j]=c;
                   root[i][j+1]=c;
                  };
                  break;
                 }

                 while(!validate(i+1,j)){
                  if(grid[i+1][j]==1&& i+1<grid.length){
                     int d=Math.min(parent[i][j], parent[i+1][j]);
                     parent[i][j]=d;
                     parent[i+1][j]=d;
                     root[i][j]=d;
                     root[i+1][j]=d;
                  };
                  break;
                 }       
       }
         public void union(int i,int j){
             while(!validate(i-1,j)){
              if(grid[i-1][j]==1&& i-1>=0){
                 find(i-1,j);
              }
              break;
             }
             while(!validate(i,j-1)){
              if(grid[i][j-1]==1&& j-1>=0){
                 find(i,j-1);
              }
              break;
             }
             while(!validate(i,j+1)){
              if(grid[i][j+1]==1 && j+1<grid.length){               
                 find(i,j+1);                
              }
              break;
             }
             while(!validate(i+1,j)){
              if(grid[i+1][j]==1&& i+1<grid.length){                 
                 find(i+1,j);
              } 
              break;
             }                
} 
//is site (i, j) full?   
     public boolean isFull(int i, int j){   

        int[][] aList=creList(i, j);
        int i1=aList[0][count-1];
        int j1=aList[1][count-1];
        int col = 0;
        int num=0;
        open(i1,j1);
        find(i1,j1);
        union(i1, j1);     

        while(col<root[0].length){
           if(root[0][col]!=10000){            
               while(num<root.length){
                   if( root[i1][j1]==root[0][num]){
                       break;
                   }; 
                   num++;
             }
           break;   
           };
           if(root[0][col]==10000) {            
               col++;};
        }
        if(col==root[0].length){col--;}
        if(num==root[0].length){num--;}
        return root[0][col]!=10000&&root[i1][j1]==root[0][num];
}  

//does the system percolate?

    public boolean percolates(){
        int i=creI();
        int j=creJ();
        int num=0;

        while(!isFull(i, j)){percolates();break;};
        while(num<grid.length){
            if(root[grid.length-1][num]==root[i][j]){
                break;  
            };
            if(root[grid.length-1][num]!=root[i][j]){
                num++;  
            };
            if(num==grid.length){
                percolates();
            }
        }

        return true;



     }  





    public static void main(String[] args){
        int i=0;
           list = new int[100];  
           while(i<100){
               Percolation p=new Percolation(3);                         
               while(p.percolates()==true){
                 int c=p.count;
                 list[i]=c;              
                 i++;
                 break;
               }

    }  ;   // test client (optional)
}}
Kylie
  • 9
  • 2
  • I have a hard time understanding why you think you can savely use the value of `aList[0][count-1]` as an index, especially since you also use values like 10000. And you should recheck ***when*** one should use a semicolon. Don't spam them. – Tom Nov 21 '16 at 04:18
  • thank you,i try another way to solve this problem,it is too duplicated. – Kylie Nov 25 '16 at 14:08

0 Answers0