Following works:
std::vector<unsigned> floodFill(const std::vector<unsigned>& map, unsigned int row, unsigned int column)
{
std::vector<unsigned> res(map.size() + 2); // Add 'border' to avoid special case
res[1 + row] = (1u << column) & map[row]; // Seed point (column: right to left)
std::vector<unsigned> last;
do {
last = res;
for (std::size_t i = 0, size = map.size(); i != size; ++i) {
res[i + 1] |= (res[i] | res[i + 2] | (res[i + 1] << 1u) | (res[i + 1] >> 1u)) & map[i];
}
} while (last != res);
res.pop_back(); // remove extra border.
res.erase(res.begin()); // remove extra border.
return res;
}
Test it: (I use C++11 here)
int main(int argc, char *argv[])
{
const std::vector<unsigned int> v = {9, 10, 13, 6};
const std::vector<unsigned int> expected = {8, 8, 12, 6};
std::vector<unsigned int> res = floodFill(v, 3, 2);
assert(res == expected);
assert(floodFill({3, 14, 3, 13}, 1, 1) == std::vector<unsigned int>({3, 14, 3, 1}));
assert(floodFill({9, 4, 5, 3}, 1, 2) == std::vector<unsigned int>({0, 4, 4, 0}));
return 0;
}