по мотивам предыдущей темы про лямбды
Имеется незамысловатый алгоритм на C++ (с небольшими примесями Objective-C, но это не страшно), состоящий из двух аналогичных частей, вторая написана копипастой:
C++ (Qt)
if (checkState != IgnoreHorizontal)
{
NumberGridLayer *numberLayer = self.gridsManager.verticalScrollView.gridView.gridLayer;
uchar row = cell.row();
if (numberLayer.grid->lineLengthAtMainIndex(row) == 1) // only one number in the line
{
// it's the rightmost cell
NumberCell &numberCell = numberLayer.grid->cellAt(row, numberLayer.grid->columns() - 1);
// count how many cells are colored
uchar colored = 0;
for (uchar j = 0; j < cols; ++j)
{
if (grid.cellAt(row, j).state() == CellState::Colored)
++colored;
else if (colored) // stop counting if it's not a solid colored line
break;
}
if (colored == numberCell.number())
{
// cross out the number
if (numberCell.setState(CellState::Colored))
[numberLayer drawCell:numberCell];
// set other cells in the line to spacers
for (uchar j = 0; j < cols; ++j)
{
GridCell &aCell = grid.cellAt(row, j);
if (aCell.state() == CellState::Blank)
{
aCell.setState(CellState::Spacer);
[nonogramLayer drawCell:aCell];
}
}
}
}
}
if (checkState != IgnoreVertical)
{
NumberGridLayer *numberLayer = self.gridsManager.horizontalScrollView.gridView.gridLayer;
uchar col = cell.column();
if (numberLayer.grid->lineLengthAtMainIndex(col) == 1) // only one number in the line
{
// it's the botommost cell
NumberCell &numberCell = numberLayer.grid->cellAt(numberLayer.grid->rows() - 1, col);
// count how many cells are colored
uchar colored = 0;
for (uchar i = 0; i < rows; ++i)
{
if (grid.cellAt(i, col).state() == CellState::Colored)
++colored;
else if (colored) // stop counting if it's not a solid colored line
break;
}
if (colored == numberCell.number())
{
// cross out the number
if (numberCell.setState(CellState::Colored))
[numberLayer drawCell:numberCell];
// set other cells in the line to spacers
for (uchar i = 0; i < rows; ++i)
{
GridCell &aCell = grid.cellAt(i, col);
if (aCell.state() == CellState::Blank)
{
aCell.setState(CellState::Spacer);
[nonogramLayer drawCell:aCell];
}
}
}
}
}
Алгоритм выполняется для горизонтали и для вертикали, основное отличие — как считывать ячейку (в нескольких местах). Понятно, что можно сделать функцию с тучей параметров, но может есть способ получше? В дальнейшем будет еще несколько подобных алгоритмов (в смысле что некий алгоритм будет выполняться для горизонтали и для вертикали, опять же с отличием лишь в способе получении ячеек).
P.S. Можем и алгоритмы (автоматического зачеркивания чисел в «японских кроссвордах») обсудить