We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
  • Hackerrank Home
  • Prepare
    NEW
  • Certify
  • Compete
  • Career Fair
  • Hiring developers?
  1. Prepare
  2. Artificial Intelligence
  3. Digital Image Analysis
  4. Image Segmentation #1
  5. Discussions

Image Segmentation #1

Problem
Submissions
Leaderboard
Discussions

    You are viewing a single comment's thread. Return to all comments →

  • tpgreene
    4 years ago+ 1 comment
    #include<iostream>
    #include<vector>
    #include<stack>
    
    void expandnode(std::vector<std::vector<int>>& grid, std::vector<std::vector<bool>>& visited, int noder2, int nodec2, int& count)
    {
        //create temp variables
        int tempr=noder2;
        int tempc=nodec2;
        
        //create stack and add current to it, row in first, then column, so col first out
        std::stack<int> queue;
        queue.push(tempr);
        queue.push(tempc);
    
        //change start node to visited
        visited[tempr][tempc]=true;
        
        while(!queue.empty())
        {
            //pop last vector(column at end, then row)
            tempc=queue.top();
            queue.pop();
            tempr=queue.top();
            queue.pop();
            
            //push unvisited 4-neighbors equal to 1 to queue
            if(tempr>0&&grid[tempr-1][tempc]==1&&visited[tempr-1][tempc]==false)
            {
                queue.push(tempr-1);
                queue.push(tempc);
                visited[tempr-1][tempc]=true;
            }
            
            if(tempr<3&&grid[tempr+1][tempc]==1&&visited[tempr+1][tempc]==false)
            {
                queue.push(tempr+1);
                queue.push(tempc);
                visited[tempr+1][tempc]=true;
            }
            
            if(tempc>0&&grid[tempr][tempc-1]==1&&visited[tempr][tempc-1]==false)
            {
                queue.push(tempr);
                queue.push(tempc-1);
                visited[tempr][tempc-1]=true;
            }
            
            if(tempc<11&&grid[tempr][tempc+1]==1&&visited[tempr][tempc+1]==false)
            {
                queue.push(tempr);
                queue.push(tempc+1);
                visited[tempr][tempc+1]=true;
            }
        /*this cycle will keep exploring stack in dfs/bfs first manner until all connected marked       
        as visited*/
        }
                
        //increment count of objects
        count++;  
    }
    
    int main()
    {
        //mimick input matrix
        std::vector<int> row0{0,0,0,1,1,0,0,0,1,0,1,0};
        std::vector<int> row1{1,1,1,0,1,1,1,1,0,0,0,1};
        std::vector<int> row2{1,1,1,0,1,0,0,1,0,0,1,0};
        std::vector<int> row3{1,0,0,0,0,0,0,0,0,1,0,0};
        std::vector<std::vector<int>> grid;
        
        //establish single grid
        grid.push_back(row0);
        grid.push_back(row1);
        grid.push_back(row2);
        grid.push_back(row3);
        
        //establish visited grid
        std::vector<std::vector<bool>> visited(4, std::vector<bool>(12, false));
        
        //establish base count of objects(all connected groups of 1)
        int count=0;
        
        for(int i=0; i<grid.size(); i++)
        {
            for(int j=0; j<grid[i].size();j++)
            {
                if(grid[i][j]==1&&visited[i][j]==false)
                {
                expandnode(grid, visited, i, j, count);  
                }
                    
            }
        }
        
        std::cout<<count;
    }
    
    2|
    Permalink
  • Blog
  • Scoring
  • Environment
  • FAQ
  • About Us
  • Support
  • Careers
  • Terms Of Service
  • Privacy Policy
  • Request a Feature