2010-09-28 4 views
0

im делать проект, и эта часть важна для меня. Мы постараемся быть максимально ясными.массив головоломка: генерация всех возможных комбинаций

Предположим, что у нас есть матрица mxn со всеми 0, мне нужно сгенерировать все возможные комбинации массива, в которых только один элемент в строке инициализируется 1, а все остальные элементы в этой строке равны 0. аналогично, во всех рядах ровно один элемент должен быть равен 1. ex: взять матрицу 3x2, должен быть выход:

[1 0,1 0,1 0], [1 0, 1 0, 0 1], [1 0,0 1,1 0], [1 0, 0 1, 0 1], [0 1, 1 0,1 0], [0 1, 1 0, 0 1], [0 1, 0 1, 1 0], [0 1, 0 1, 0 1]

значения в квадратных скобках являются матрицей 3x2, каждая строка разделяется запятой. так что в основном, матрица mxn будет иметь n power m количество комбинаций. любой, кто может думать о любом возможном способе решения этого вопроса, опубликовать его, его действительно важно. заранее спасибо

+3

Это звучит как домашнее задание. Если это так, он должен быть помечен как таковой. –

+0

Если вы используете C++, у вас будет функция [next_permutation] (http://www.cplusplus.com/reference/algorithm/next_permutation/). Он работает на контейнерах STL и делает то, что вам нужно. – TrueY

ответ

1

Поскольку это звучит как домашнее задание, я не собираюсь дать вам полное решение, а несколько шагов в правильном направлении. Начнем с матрицы 3x2. Мы можем решить эту проблему с помощью вложенных для петель:

int row0, row1, row2; 
for(row0=0; row0<2; ++row0) { 
    matrix[0][row0] = 1; 
    for(row1=0; row1<2; ++row1) { 
    matrix[1][row1] = 1; 
    for(row2=0; row2<2; ++row2) { 
     matrix[2][row2] = 1; 
     print_matrix(matrix); 
     matrix[2][row2] = 0; 
    } 
    matrix[1][row1] = 0; 
    } 
    matrix[0][row0] = 0; 
} 

Конечно, это не очень общее решение. Легко изменить это на матрицу 3xm (просто замените row#<2 на row#<m-1), но это явно не работает для матрицы nxm. Каждый раз, когда мы увеличиваем n на один, нам нужно добавить еще один цикл.

Я оставляю это для вас, чтобы определить, как избавиться от вложенных циклов и использовать другую технику для ее обобщения.

Смежные вопросы