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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2011, 14:11   #1
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию Перебор элементов

Имеется двумерный массив из неопределенного количества элементов

Нужно перебрать все варианты расположения его строк, скармливая массив функции
int func(int[][] array);

для получения оптимального результата. Как это сделать ? язык С#



я понимаю, что при больших значениях количества строк (15+) количество вариантов будет очень большое и нужно искать другое решение, но мне нужно решение хотя бы для этих 15, в общем виде.

Вот то, что у меня получилось для 4х строк, смущает размер кода (думаю есть более красивое решение)

Код:
for (int first = 0; first < Details; first++)
{
	for (int second = 0; second < Details; second++)
	{
		if (Details == 2)
		{
			// calculate for 2
			if ((new int[] { first, second }).Distinct().Count() != Details) continue; // если одинаковые строки, пропустить
			bruteString += (first + 1).ToString() + " " + (second + 1).ToString() + Environment.NewLine;
			int[][] calcData = new int[][] { data[first], data[second] };
			int result = doCalculate(calcData); // промежуточный результат, для выбора оптимального
		}
		else
		{
			for (int third = 0; third < Details; third++)
			{
				if (Details == 3)
				{
					// calculate for 3
					if ((new int[] { first, second, third }).Distinct().Count() != Details) continue; // если одинаковые строки, пропустить
					bruteString += (first + 1).ToString() + " " + (second + 1).ToString() + " " + (third + 1).ToString() + " " + Environment.NewLine;
					int[][] calcData = new int[][] { data[first], data[second],data[third] };
					int result = doCalculate(calcData); // промежуточный результат, для выбора оптимального
				}
				else
				{
					for (int forth = 0; forth < Details; forth++)
					{
						if ((new int[] { first, second, third, forth }).Distinct().Count() != Details) continue;// если одинаковые строки, пропустить
						bruteString += (first + 1).ToString() + " " + (second + 1).ToString() + " " + (third + 1).ToString() + " " + (forth + 1).ToString() + " " + Environment.NewLine;
						int[][] calcData = new int[][] { data[first], data[second], data[third],data[forth] };
						int result = doCalculate(calcData); // промежуточный результат, для выбора оптимального
					}
				}
			}
		}
	}
}

Последний раз редактировалось Namolem; 17.04.2011 в 14:19.
Namolem вне форума Ответить с цитированием
Старый 17.04.2011, 14:42   #2
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию

Как всегда, только написав на форум, придумал решение =)
Namolem вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор элементов. Vaigard Общие вопросы Delphi 9 03.01.2011 13:09
перебор элементов (Pascal) PianeR Помощь студентам 2 18.12.2010 00:52
Перебор элементов собственного класса (JavaScript) DaeMooN JavaScript, Ajax 3 24.01.2009 16:28
Перебор элементов матрицы pikkk Общие вопросы Delphi 3 09.05.2008 14:45
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44