static private void exploreNeighbors(neighbors neighborsCoords, List <blackDot> blackDotsList, Queue <blackDot> unexploredDotsQueue) { foreach (neighborCoordinates neighbor in neighborsCoords) { if (blackDotsList.Any(dot => dot.y == neighbor.y && dot.x == neighbor.x && dot.isMapped == false && dot.isInQue == false)) { blackDot newUnexploredPartOfTheIsland = blackDotsList.Find(dot => dot.y == neighbor.y && dot.x == neighbor.x); unexploredDotsQueue.Enqueue(newUnexploredPartOfTheIsland); newUnexploredPartOfTheIsland.isInQue = true; } } }
// next procedure starts exploratrion from a firstPoint and than maps an island with all other connected black dots static private void islandMapper(blackDot firstDot, List <blackDot> blackDotsList) { Queue <blackDot> unexploredDotsQueue = new Queue <blackDot>(); unexploredDotsQueue.Enqueue(firstDot); while (unexploredDotsQueue.Count > 0) { blackDot currentDot = unexploredDotsQueue.Dequeue(); neighbors neighborsOfCurrentDot = new neighbors(currentDot); exploreNeighbors(neighborsOfCurrentDot, blackDotsList, unexploredDotsQueue); currentDot.isMapped = true; } }
private void Neighbors(out neighbors neighbs, int I, int J) { neighbs = new neighbors(); neighbs.xleft = I - 1; neighbs.xright = I + 1; neighbs.ytop = J - 1; neighbs.ydown = J + 1; if (I - 1 < 0) { neighbs.xleft = size.X - 1; } if (I + 1 > size.X - 1) { neighbs.xright = 0; } if (J - 1 < 0) { neighbs.ytop = size.Y - 1; } if (J + 1 > size.Y - 1) { neighbs.ydown = 0; } }
private int[,] getNeighbor(int[,] board, neighbors neighbor) { int[,] returnBoard = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; int emptyX = -1, emptyY = -1; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { returnBoard[i, j] = board[i, j]; if (board[i, j] == 0) { emptyX = i; emptyY = j; } } } switch (neighbor) { case (neighbors.top): if (emptyX > 0) { returnBoard[emptyX, emptyY] = board[emptyX - 1, emptyY]; returnBoard[emptyX - 1, emptyY] = board[emptyX, emptyY]; } else { return(null); } break; case (neighbors.left): if (emptyY > 0) { returnBoard[emptyX, emptyY] = board[emptyX, emptyY - 1]; returnBoard[emptyX, emptyY - 1] = board[emptyX, emptyY]; } else { return(null); } break; case (neighbors.bottom): if (emptyX < 2) { returnBoard[emptyX, emptyY] = board[emptyX + 1, emptyY]; returnBoard[emptyX + 1, emptyY] = board[emptyX, emptyY]; } else { return(null); } break; case (neighbors.right): if (emptyY < 2) { returnBoard[emptyX, emptyY] = board[emptyX, emptyY + 1]; returnBoard[emptyX, emptyY + 1] = board[emptyX, emptyY]; } else { return(null); } break; } return(returnBoard); }