private static int BreadthFirst(Building[,] block, Building startingPos, int blockRows, int blockColumns)
{
Queue<Building> nodes = new Queue<Building>();
nodes.Enqueue(startingPos);
int visitedNodesCount = 0;
while (nodes.Count != 0)
{
Building currentNode = nodes.Dequeue();
currentNode.Visited = true;
if (currentNode.Row == blockRows-1 || currentNode.Column == blockColumns-1 || currentNode.Row == 0 || currentNode.Column == 0)
visitedNodesCount++;
//check all adjacencies to find one higher than it
for (int row = -1; row <= 1; row++)
{
for (int column = -1; column <= 1; column++)
{
if ((column != 0 && row != 0) || (row == 0 && column == 0))
continue;
//get point to check
int buildingRow = currentNode.Row + row;
int buildingColumn = currentNode.Column + column;
if (buildingRow < 0 || buildingRow >= blockRows || buildingColumn < 0 || buildingColumn >= blockColumns)
continue;
Building adjNode = block[buildingRow, buildingColumn];
//check if the height is greater than it
if (adjNode.height >= currentNode.height && !adjNode.Visited)
{
//we can go there, add it to the queue
if (!nodes.Contains(adjNode))
nodes.Enqueue(adjNode);
}
}
}
}
return visitedNodesCount;
}