Вложенные циклы не очень хорошая идея, чтобы выбрать k задач:
Если бы вам приходилось занимать только 2 ячейки, вы могли бы сделать это (псевдокод):
for(int i= 0; i < grid.length*grid[0]*length; i++){
for(int j = i + 1; j < grid.length*grid[0]*length; j++){
// Build grid with cells i and j occupied
}
}
С 3 вам придется сделать следующее:
for(int i= 0; i < grid.length*grid[0]*length; i++){
for(int j = i + 1; j < grid.length*grid[0]*length; j++){
for(int j = k + 1; k < grid.length*grid[0]*length; k++){
// Build grid with cells i, j and k occupied
}
}
}
... Полагаю, вы видите проблему сейчас: если занято 9 ячеек, у вас будет 9 вложенных циклов (неприятно), и, что более важно, ваш код не будет действительным для любого другого значения занятых ячеек.
Используйте рекурсию, я делаю это не для вас, но вот подсказка:
Смысл рекурсии в том, чтобы уменьшить проблему настолько много раз, что она станет тривиальной. Что за тривиальный случай здесь?
n-выбирать-1 тривиально, это п.
// This function calculates n-choose-k
public static int nchoosek(int n, int k){
if(k == 1){
return n;
}else{
// To come up with this, you need to write down your equation and try
// to express n-choose-k as a function of n-1-choose-k-1
return nchoosek(n - 1, k - 1) * n / k;
}
}