int n, m;
int rows[n], cols[m];
int answer[n][m];
while (true) {
boolean found = false;
int row = -1, col = -1;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (rows[i] > 0 && cols[j] > 0 && (found == false || Math.min(rows[i], cols[j]) > Math.min(rows[row], cols[col])) {
found = true;
row = i;
col = j;
}
if (!found)
break;
answer[row][col]++;
rows[row]--;
cols[col]--;
}
Как это работает: каждый раз, когда мы пытаемся использовать столбцы и строки с большинством левых ячеек.