int numIslands(vector<vector<char>>& grid) { int m = grid.size(); if (m == 0) return 0; int n = grid[0].size(); if (n == 0) return 0; make_set(id, m , n); num_components = (grid[0][0] == '1'); // i == 0 for (int j = 1; j < n; j++) { if (grid[0][j] == '0') continue; num_components++; if (grid[0][j - 1] == '1') unions(to1d(0, j, n), to1d(0, j - 1, n)); } // j == 0 for (int i = 1; i < m; i++) { if (grid[i][0] == '0') continue; num_components++; if (grid[i - 1][0] == '1') unions(to1d(i, 0, n), to1d(i - 1, 0, n)); } //i != 0 && j != 0 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (grid[i][j] == '0') continue; num_components++; if (grid[i - 1][j] =='1') { unions(to1d(i, j, n), to1d(i - 1, j, n)); } if (grid[i][j - 1] == '1') { unions(to1d(i, j, n), to1d(i, j - 1, n)); } } } return num_components; }
std::vector<int> const & createSumTable(float const *volume, Vec3 extents, std::function<int(float)> empty) { svt::extents = extents; svt::sumTable.resize(size_t(extents.x) * size_t(extents.y) * size_t(extents.z)); for(int z = 1; z < extents.z; ++z) { for(int y = 1; y < extents.y; ++y) { for(int x = 1; x < extents.x; ++x) { size_t idx{ to1d(x, y, z, extents.x, extents.y) }; int v1{ empty(volume[idx]) }; int v2{ v1 + get_check(x, y, z - 1) + (get_check(x - 1, y, z) - get_check(x - 1, y, z - 1)) + (get_check(x, y - 1, z) - get_check(x, y - 1, z - 1)) - (get_check(x - 1, y - 1, z) - get_check(x - 1, y - 1, z - 1)) }; svt::sumTable[idx] = v2; }}} return svt::sumTable; }