number_of_islands.cpp
This commit is contained in:
115
puzzles/interviews/training/number_of_islands.cpp
Normal file
115
puzzles/interviews/training/number_of_islands.cpp
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
VIM: let b:lcppflags="-std=c++14 -O2 -pthread"
|
||||||
|
VIM: let b:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM-: let b:argv=""
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <exception>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
/*
|
||||||
|
FB On-site March
|
||||||
|
|
||||||
|
Q: Find number of Islands.
|
||||||
|
XXXOO
|
||||||
|
OOOXX
|
||||||
|
XXOOX
|
||||||
|
Return 3 islands.
|
||||||
|
1 1 1 O O
|
||||||
|
O O O 2 2
|
||||||
|
3 3 O O 2
|
||||||
|
*/
|
||||||
|
int number_of_islands( const std::vector<std::string>& board )
|
||||||
|
{
|
||||||
|
auto n = board.size();
|
||||||
|
auto m = board.front().size();
|
||||||
|
std::unordered_map<int,int> g;
|
||||||
|
|
||||||
|
auto idx = [m](size_t i, size_t j){
|
||||||
|
return i*m+j;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto root = [&g](size_t idx){
|
||||||
|
for (; g[idx] != idx; idx = g[idx] );
|
||||||
|
return idx;
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i ){
|
||||||
|
for (size_t j = 0; j < m; ++j){
|
||||||
|
if (board[i][j] == 'x'){
|
||||||
|
if (j>0 && board[i][j-1] == 'x'){
|
||||||
|
g[idx(i,j)]=g[idx(i,j-1)];
|
||||||
|
if (i>0 && board[i-1][j] == 'x'){
|
||||||
|
g[root(idx(i-1,j))]=g[idx(i,j)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (i>0 && board[i-1][j] == 'x'){
|
||||||
|
g[idx(i,j)]=g[idx(i-1,j)];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g[idx(i,j)]=idx(i,j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for ( const auto& node: g){
|
||||||
|
if ( node.first == node.second ){
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main ( void )
|
||||||
|
{try{
|
||||||
|
|
||||||
|
std::cout << number_of_islands({
|
||||||
|
"xxxoo",
|
||||||
|
"oooxx",
|
||||||
|
"xxoox"
|
||||||
|
}) << std::endl;
|
||||||
|
|
||||||
|
std::cout << number_of_islands({
|
||||||
|
".xx..",
|
||||||
|
"xx...",
|
||||||
|
"xxxxx"
|
||||||
|
}) << std::endl;
|
||||||
|
std::cout << number_of_islands({
|
||||||
|
"....x",
|
||||||
|
"....x",
|
||||||
|
"xxxxx"
|
||||||
|
}) << std::endl;
|
||||||
|
std::cout << number_of_islands({
|
||||||
|
"xxxxx",
|
||||||
|
"xxxxx",
|
||||||
|
"xxxxx"
|
||||||
|
}) << std::endl;
|
||||||
|
std::cout << number_of_islands({
|
||||||
|
"xxxxx",
|
||||||
|
"....x",
|
||||||
|
"xxx.x",
|
||||||
|
"x...x",
|
||||||
|
"xxxxx"
|
||||||
|
}) << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch ( const std::exception& e )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "std::exception(\"" << e.what() << "\")." << std::endl;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
catch ( ... )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "unknown exception." << std::endl;
|
||||||
|
return 1;
|
||||||
|
}}
|
||||||
|
|
||||||
Reference in New Issue
Block a user