2012-06-30 4 views
0

가능한 중복 :
Algorithm to find the total number of connected sets in a matrixInterviewstreet 퍼즐 연결 세트

질문 :

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

내 솔루션은 모든 테스트 진열창의 I를 통과하지 않습니다 포에 갈 수 없다. int out the 코드가 실패합니다. 누군가 내 코드에 무슨 문제가 있다고 지적 할 수 있습니까?

내 알고리즘은 간단합니다. 1을 만들면 해당 위치의 값이 1이라는 값이 증가 된 변수와 같습니다. 처음에는 1로 설정됩니다. 그런 다음 해당 위치의 이웃을 확인하고 그 중 하나라도 있으면 1로 설정하면 + 1로 설정됩니다.

매트릭스의 오른쪽 하단에 도달 할 때까지 같은 작업을 반복합니다. 이제 increment를 설정하고 행렬에 1이 남을 때까지 프로세스를 반복합니다 (나는 부울 왼쪽을 사용하여 이것을 결정합니다).

MY 솔루션

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]); 


     } 



    } 

} 

답변

1

여기에 귀하의 코드에 실패 하나의 테스트 케이스이다 :

1 
3 
1 0 1 
1 0 1 
1 1 1 

여기에 단지 1 구성 요소가된다.

또한 알고리즘이 느립니다. 모든 행에서 1이 이전에 연결되지 않은 경우 j을 재설정합니다. 홍수 채우기 알고리즘을 사용해보세요 : http://en.wikipedia.org/wiki/Flood_fill