перечислите все возможные комбинации блока 9x9 с 9 ячейками, занятыми каждый раз - PullRequest
1 голос
/ 02 марта 2011

это изначально двумерный массив 9x9 сеток

000000000  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000  

, если ячейка занята, она будет использовать 1 для представления ... и каждый раз должно использоваться 9 ячеек одновременно...

111111111  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000  
000000000

как написать несколько кодов для генерации всех различных комбинаций с этими девятью "1" на графике 9x9?

Ответы [ 3 ]

1 голос
/ 02 марта 2011

Я бы, вероятно, использовал рекурсивный метод или пару вложенных для циклов.

Однако вы должны знать, что

81 выбирают 9 = 260 887 834 350

таких комбинаций.

0 голосов
/ 02 марта 2011

Вложенные циклы не очень хорошая идея, чтобы выбрать 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;
    }
}
0 голосов
/ 02 марта 2011

Нет готового ответа, поскольку это звучит как домашнее задание, но небольшой совет: эта проблема эквивалентна выбору всех возможных 9-элементных подпоследовательностей из последовательности 1..81.Отметьте этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...