Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2014, 13:39   #1
photozaz
Пользователь
 
Регистрация: 05.04.2008
Сообщений: 66
По умолчанию Перебор всех значений двумерного массива

Добрый день. Есть задача написать процедуру на вход которой будет подаваться двумерный массив рандомной размерности. Требуется вывести все возможные суммы элементов с условием что за одну итерацию из одномерного массива(строки) берется только одно значение. Сам алгоритм выглядит следующим образом.

Пример:

на входе:
123
456
789

на выходе:
1+4+7 1+4+8 1+4+9
1+5+7 1+5+8 1+5+9
1+6+7 1+6+8 1+6+9

2+4+7 2+4+8 2+4+9
2+5+7 2+5+8 2+5+9
2+6+7 2+6+8 2+6+9

3+4+7 3+4+8 3+4+9
3+5+7 3+5+8 3+5+9
3+6+7 3+6+8 3+6+9

Вопрос: как реализовать данный алгоритм для массива nxn(array [n][n])?
photozaz вне форума Ответить с цитированием
Старый 30.09.2014, 11:22   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

А наработки имеются?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 30.09.2014, 15:15   #3
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Держи. Компановку вывода под конечный результат реализуете самостоятельно.
Код:
package programmersforum;

public class Enumeration {
    /**
     * Выводит все возможные суммы элементов с условием, что за одну итерацию из
     * одномерного массива(строки) берется только одно значение.
     * @param in Исходный двумерный массив размерности nxn
     */
    public static final void showAllAmount( final int [][] in ) {
        if ( in == null || in.length == 0 || (in.length != in[0].length) ) {
            throw new IllegalArgumentException("Не соответствие условиям задачи");
        }
        final int [] indexes = new int [in.length];
        final int maxRowIndex = indexes.length - 1;
        for(int i = 0; i < maxRowIndex; i++) {
            indexes[i] = 0;
        }
        indexes[maxRowIndex] = -1;
        
        while ( next(indexes, maxRowIndex) ) {
            for(int i = 0; i < indexes.length; i++) {
                System.out.print(in[i][indexes[i]]);
                if ( i < maxRowIndex ) {
                    System.out.print("+");
                } else {
                    System.out.print(" ");
                }
            }
        }
    }
    /**
     * Переводит массив индексов к следующему значению/шагу.
     * @param indexes Массив содержащий текущие положение обрабатываемых идндексов.
     * @param pos Стартовая позиция для увеличения индекса.
     * @return Возвращает true, если увеличение прошло успешно, false - если 
     * увеличение индекса более не возможно (все возможные значения были 
     * использованы).
     */
    private static boolean next(final int [] indexes, int pos) {
        if ( indexes[pos] == indexes.length - 1 ) {
            if ( pos == 0 ) {
                return false;
            }
            indexes[pos] = 0;
            return next(indexes, pos - 1);
        }
        indexes[pos]++;
        return true;
    }
    
    public static void main(String [] args) {
        final int [][] in = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        Enumeration.showAllAmount(in);
    }
}
BleStaR вне форума Ответить с цитированием
Старый 11.10.2014, 16:14   #4
photozaz
Пользователь
 
Регистрация: 05.04.2008
Сообщений: 66
По умолчанию

реализовал следующим образом
Код:
         /**
	 * Find highest sums in jagged array
	 * @param lists is a jagged array to be processed
	 * @param n is a number of highest sums to be found
	 * @return
	 */
	public List<Integer> findSums(int[][] lists, int n) {
	 
		ArrayList<Integer> allSums = new ArrayList<Integer>();
				
		for (int i=0; (i<lists[0].length)&(i<n); i++)	// get the first list of elements of lists[][]; cut list to n size
			allSums.add(lists[0][i]);	
		
		if (lists.length>1) {
			
			 for (int r=1; r<lists.length; r++) {
				 ArrayList<Integer> sums = new ArrayList<Integer>();
				 for(int c=0; (c<lists[r].length)&(c<n); c++) {
					 sumElements(allSums,lists[r][c], sums);
				 }
				 
				 sums = ArrayOperations.arraySortDescending(sums);
				 allSums.clear();
				 allSums.addAll(sums);	// store sorted sums into allSums list
				 sums.clear();		// clear sums list				
			 }
			 
		 } else {
			 	if (allSums.size()>n)
			 		allSums.subList(n, allSums.size()).clear();
		 }
	 
		return allSums;
	}
	
	/**
	 * Count sums for every element in row with elements of previous row
	 * @param array
	 * @param nlv is the next list value
	 * @param sums is a temporary storage for sums between two lists 
	 */
	private void sumElements(ArrayList<Integer> list, int nlv, ArrayList<Integer> sums) {
		for (int i=0; i<list.size(); i++) {
			sums.add(list.get(i) + nlv);
		}
	}
photozaz вне форума Ответить с цитированием
Старый 12.10.2014, 05:01   #5
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

проводил какие нить тесты на скорость?
BleStaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех доступных значений! AquaKlaster Общие вопросы Delphi 40 02.03.2015 12:27
Обработка двумерного массива целых значений (С++). В коде ошибка NataliaNatkina Помощь студентам 5 27.11.2012 16:26
Задание на обработку двумерного массива!Найти наибольшее из значений элементов столбца ленок-носок Помощь студентам 10 18.03.2012 17:01
Изменение двумерного массива с сохранением всех данных. Vova777 Общие вопросы Delphi 10 03.09.2011 20:39
Перебор всех возможных сумм элеметов массива Sanakan Помощь студентам 3 29.03.2010 00:28