Вы можете сделать что-то подобное, когда окружите карту:
std::size_t compute_width_of_town(const std::vector<std::string>& map,
std::size_t x, std::size_t y)
{
std::size_t width;
for (width = 0; map[x + width][y] == 'T'; ++width) {/* Empty */}
return width;
}
std::size_t compute_height_of_town(const std::vector<std::string>& map,
std::size_t x, std::size_t y)
{
std::size_t height;
for (height = 0; map[x][y + height] == 'T'; ++height) {/* Empty */}
return height;
}
bool validate_inside_town(const std::vector<std::string>& map,
std::size_t x, std::size_t y,
std::size_t width, std::size_t height)
{
for (std::size_t i = 0; i != width; ++i) {
for (std::size_t j = 0; j != height; ++j) {
if (map[x + i][y + j] != 'T') {
return false;
}
}
}
return true;
}
bool validate_around_town(const std::vector<std::string>& map,
std::size_t x, std::size_t y,
std::size_t width, std::size_t height)
{
for (std::size_t i = 0; i != width; ++i) {
if (map[x + i][y - 1] == 'T'
|| map[x + i][y + height] == 'T') {
return false;
}
}
for (std::size_t j = 0; j != height; ++j) {
if (map[x - 1][y + j] == 'T'
|| map[x + width][y + j] == 'T') {
return false;
}
}
return true;
}
bool validate_town(const std::vector<std::string>& map,
std::size_t x, std::size_t y)
{
const std::size_t width = compute_width_of_town(map, x, y);
const std::size_t height = compute_height_of_town(map, x, y);
return width <= 3
&& height <= 3
&& validate_inside_town(map, x, y, width, height)
&& validate_around_town(map, x, y, width, height);
}
bool validate_map(const std::vector<std::string>& map)
{
for (std::size_t i = 1; i != map.size() - 1; ++i) {
for (std::size_t j = 1; j != map[i].size() - 1; ++j) {
if (map[i][j] == 'T'
&& map[i - 1][j] != 'T'
&& map[i][j - 1] != 'T'
&& !validate_town(map, i, j))
{
return false;
}
}
}
return true;
}
и протестируйте что-то вроде:
std::cout << validate_map({
"XXXXXXXXXXXX",
"XGGGGGGTGGGX",
"XGGTTTGGGGTX",
"XGGTTTGGGGTX",
"XGGTTTGGGGTX",
"XGGGGGGTTGGX",
"XXXXXXXXXXXX"
}) << std::endl;
Демо