+static void
+fill_living(dvonn_board_t *board,
+ int living[DVONN_BOARD_X_SIZE][DVONN_BOARD_Y_SIZE],
+ int x, int y)
+{
+ if (dvonn_board_cell_occupied (board, x, y) && ! living[x][y])
+ {
+ living[x][y] = 1;
+
+ fill_living (board, living, x - 1, y);
+ fill_living (board, living, x + 1, y);
+ fill_living (board, living, x, y - 1);
+ fill_living (board, living, x, y + 1);
+ fill_living (board, living, x + 1, y - 1);
+ fill_living (board, living, x - 1, y + 1);
+ }
+}
+
+static void
+eliminate_disconnected_stacks (dvonn_board_t *board)
+{
+ int x, y;
+ int living[DVONN_BOARD_X_SIZE][DVONN_BOARD_Y_SIZE];
+
+ for (x = 0; x < DVONN_BOARD_X_SIZE; x++)
+ for (y = 0; y < DVONN_BOARD_Y_SIZE; y++)
+ living[x][y] = 0;
+
+ for (x = 0; x < DVONN_BOARD_X_SIZE; x++)
+ for (y = 0; y < DVONN_BOARD_Y_SIZE; y++)
+ if (board->cells[x][y].contains_red)
+ fill_living (board, living, x, y);
+
+ for (x = 0; x < DVONN_BOARD_X_SIZE; x++)
+ for (y = 0; y < DVONN_BOARD_Y_SIZE; y++)
+ if (dvonn_board_cell_occupied (board, x, y) &&
+ ! living[x][y])
+ {
+ board->cells[x][y].type = DVONN_CELL_EMPTY;
+ board->cells[x][y].height = 0;
+ }
+}
+