#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef vector<string> MyMap;
void PrintMap( MyMap world) {
for(auto line : world) {
cout << line << endl;
}
cout << endl;
return;
}
void ReadWorld(MyMap < world) {
string word;
cin >> word;
while (cin) {
world.push_back(word);
cin >> word;
}
return;
}
bool FindDot(int < x, int < y, MyMap < world) {
for(x=0;x<world.size();x++) {
for(y=0;y<world[x].size(); y++) {
if (world[x][y] == '.') {
return true;
}
}
}
return false;
}
void Flood(MyMap < world, int x, int y, char mark) {
if (x < 0 or x >= world.size() ) {
// out of bounds on x;
return;
}
if (y < 0 or y >= world[x].size()) {
// out of bounds on y;
return;
}
if (world[x][y] != '.') {
// not a flood fillable spot
return;
}
world[x][y] = mark;
Flood(world, x-1,y, mark);
Flood(world, x+1,y, mark);
Flood(world, x,y+1, mark);
Flood(world, x,y-1, mark);
return;
}
int main() {
MyMap world;
ReadWorld(world);
PrintMap(world);
int land = 0;
int x,y;
while (FindDot(x,y,world)) {
Flood(world, x,y, char('A'+land));
PrintMap(world);
land ++;
}
cout << "There are " << land << " islands" << endl;
return 0;
}
Or a little cleaner version
void Flood2(MyMap & world, int x, int y, char mark) {
vector<int> xo = {-1,+1,0,0};
vector<int> yo = {0,0,-1,+1};
if (x < 0 or x >= world.size() ) {
// out of bounds on x;
return;
}
if (y < 0 or y >= world[x].size()) {
// out of bounds on y;
return;
}
if (world[x][y] != '.') {
// not a flood fillable spot
return;
}
world[x][y] = mark;
for(int i=0;i<xo.size();i++) {
Flood(world, x+xo[i], y+yo[i], mark);
}
return;
}
Or a little safer version
int adjust(int pos, int max) {
if (pos >= max) {
return 0;
}
if (pos <= 0) {
return max-1;
}
}
void Flood(MyMap & world, int x, int y, char mark) {
x = adjust(x,world.size());
y = adjust(y,world[x].size());
vector xo = {-1, 0, +1, -1, +1, -1, 0, +1};
vector yo = {-1,-1 ,-1, 0, 0, +1, +1, +1};
if (world[x][y] != '.') {
// not a flood fillable spot
return;
}
world[x][y] = mark;
for(int i=0;i<xo.size();i++) {
Flood(world, x+xo[i], y+yo[i], mark);
}
return;
}