2012-06-30 1 views
0

Possible en double:
Algorithm to find the total number of connected sets in a matrixcasse-tête Interviewstreet ensembles connectés

LA QUESTION:

https://amazonindia.interviewstreet.com/challenges/dashboard/#problem/4fd6570bd51e1

Ma solution ne passe pas tout cases.But test I je ne suis pas capable de po int sur les scénarios où mon code échouera. Quelqu'un peut-il signaler ce qui ne va pas avec mon code?

Mon algorithme est simple: lorsque vous trouvez un 1, la valeur de cette position est égale à une variable appelée incrémentée de 1. Initialement, la valeur sera 1. Ensuite, vérifiez les voisins de cette position et si l'un d'entre eux est 1 le rend égal à set + 1. Répétez la même chose jusqu'à ce que vous atteigniez le bas à droite de la matrice. Maintenant, incrémentez et répétez le processus jusqu'à ce qu'il reste 1 dans la matrice (je décide cela en utilisant la gauche booléenne).

Ma solution

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 


public class Solution { 


    public static void main(String[] args) throws IOException { 


       String no_of_tc; 

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     no_of_tc=br.readLine(); 
     int[] result=new int[Integer.parseInt(no_of_tc)]; 
     int mdim=0,maxset=0; 
     boolean left=false; 
     int i=0; 
     boolean first=true; 
     //boolean anyneighbour=false; 
     for(i=0;i<Integer.parseInt(no_of_tc);i++) 
     { 
      maxset=0; 
      left=false; 
      first=true; 
      mdim=Integer.parseInt(br.readLine()); 

      int[][] matrix=new int[mdim][mdim]; 
      String[] values=new String[mdim]; 
      int valuecount=0,counter=0,countchar=0; 

      for(valuecount=0;valuecount<mdim;valuecount++) 
      { 
       countchar=0; 
       values[valuecount]=br.readLine(); 
       for(counter=0;counter<mdim;counter++) 
       { 
        char temp=(values[valuecount].charAt(countchar)); 
        countchar=countchar+2; 
        matrix[valuecount]counter]=Character.getNumericValue(temp); 
       } 

      } 


      int j=0,k=0,set=1; 
      while(j<mdim) 
      { 

       while(k<mdim) 
       { 
       if(first) 
       { 
        if(matrix[j][k]==1) 
        { 
         matrix[j][k]=set+1; 
         first=false; 
         maxset=set; 
        } 
       } 
       if(matrix[j][k]==set+1) 
       { 
        if((j-1>=0)&&(k+1<mdim)&&(matrix[j-1][k+1]==1)) 
        { 
         matrix[j-1][k+1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 
        } 
        if((j-1>=0)&&matrix[j-1][k]==1) 
        { 
         matrix[j-1][k]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 
        } 
        if((j-1>=0)&&(k-1>=0)&&matrix[j-1][k-1]==1) 
        { 
         matrix[j-1][k-1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 
        } 
        if((k+1<mdim)&&matrix[j][k+1]==1) 
        { 
         matrix[j][k+1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 
        } 

        if((k-1>=0)&&matrix[j][k-1]==1) 
        { 
         matrix[j][k-1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 

        } 

        if((j+1<mdim)&& (k+1<mdim) && matrix[j+1][k+1]==1) 
        { 
         matrix[j+1][k+1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 

        } 
        if((j+1<mdim)&&matrix[j+1][k]==1) 
        { 
         matrix[j+1][k]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 

        } 
        if((j+1<mdim)&&(k-1>=0)&&matrix[j+1][k-1]==1) 
        { 
         matrix[j+1][k-1]=set+1; 
         //anyneighbour=true; 
         //proceedwhole=proceedwhole+1; 

        } 

//     if(anyneighbour==false&&proceedwhole==1) 
//     { 
//      first=true; 
//      set=set+1; 
//    
//      result[i]=result[i]+1; 
//      break; 
//     } 
//     


       } 
       else 
       { 

        if(matrix[j][k]==1) 
        { 

         left=true; 

        } 

       } 

       k++; 

      } 
       k=0; 
       j++; 


       if(j==mdim) 
       { 
        if(left==true) 
        { 
         j=0; 
        first=true; 
         left=false; 

         set=set+1; 

        } 
        else 
        { 
         result[i]=maxset; 
        } 


       } 
//    if(anyneighbour==false&&left==true) 
//    { 
//     j=0; 
//     left=false; 
//     
//    } 
      } 



     } 
     int counter2=0; 

     for(counter2=0;counter2<Integer.parseInt(no_of_tc);counter2++) 
     { 
      System.out.println(result[counter2]); 


     } 



    } 

} 

Répondre

1

Voici un cas de test votre code échoue à:

1 
3 
1 0 1 
1 0 1 
1 1 1 

Il y a seulement 1 élément ici.

De plus, votre algorithme est lent. A chaque ligne, vous réinitialisez j lorsqu'il y a un 1 non connecté au précédent. Essayez l'algorithme de remplissage d'inondation: http://en.wikipedia.org/wiki/Flood_fill

Questions connexes