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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2011, 22:23   #1
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
Вопрос C# всевозможные сочетания

Есть несколько (неизвестное количество) списков символов, из этих списков необходимо составить всевозможные строки длинной равной количеству списков.
Алгоритмы, коды, советы, мысли .... хоть что нибудь все голову уже сломал
Как вы сформулируете вопрос так вам и ответят
xil вне форума Ответить с цитированием
Старый 03.01.2011, 22:58   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

На сколько я понял:
У тебя даны (допустим) 2 списка:
1) авт
2) ма
Составляем строки, длиной с количество списков( т.е. в данном случае 2)
ав ат вт ат тв ва та ам аа ма (не знаю насчет повторений). Ну в общем так.
Пишешь класс Список. Делаешь массив списков. А далее идет перебор символов.( Это сразу не соображу как лучше сделать,но все решаемо.) В общем начинай писать,выкладывай исходники,а там что-нибудь придумаем.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 03.01.2011, 23:05   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, всё зависит от того, каким образом задаются эти самые списки и, главное, их количество...

Давайте код, как Вы задаёте Ваше "неизвестное количество" списков..

ну и ещё, почему длина конечной строки должна быть равна количеству списков ?
Давайте на конкретном примере.
Пусть даны три списка: {'1','2'} {'A','B','C', 'D'} {'@','#'}
приведите корректные варианты сочетаний...


ДОБАВЛЕНО
Когда писал, не видел ответ Скарам -
поэтому прошу не считать мой пост каким-то образом связанным с его ответом...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2011, 23:14   #4
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
По умолчанию

Скарам, не много не верно.

Serge_Bliznykov
принцип таков: из списков {'1','2'} {'A','B','C', 'D'} {'@','#'} составляются следующие варианты:
1A@ 1A# 1B@ 1B# 1C@ 1C# 1D@ 1D#
2A@ 2A# 2B@ 2B# 2C@ 2C# 2D@ 2D#
т.е. в получаемой строке должно быть по одному символу каждого списка

списки жестко закодированы, но в ходе выполнения выбирается их количество и последовательность (что важно)
Как вы сформулируете вопрос так вам и ответят

Последний раз редактировалось xil; 03.01.2011 в 23:20.
xil вне форума Ответить с цитированием
Старый 03.01.2011, 23:22   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Т.е. символ в строке привязан к номеру списка? и из каждого списка можно брать только один элемент?
Из приведённого мною примера
такие сочетания недопустимы?
Код:
#1A
B@2
B1A
Цитата:
количество списков и их длинна за ранее не известны
Откуда в программе будут браться эти списки?! Случайным образом? Или вводится откуда нибудь?
Проиллюстрируйте свой ответ примером кода...


А вообще задача может быть решена "в лоб", например, таким образом -
заводите массив указателей. Размер массива равен количеству списков.
И дальше туда заносим 1, 1... 1
Это строчка, состоящая из первых элементов списков.
Пусть у нас есть размерность каждого списка K1 - сколько элементов в первом списке,
K2 - во втором, Kn - в N-м списке..

Далее крутим цикл
пока все элементы не будет равны Ki
по N - му последнему элементу, пока он не достигнет Kn
если достиг - увеличиваем N-1 элемент на один, а последний ставим 1

т.е. обеспечиваем в цикле добавление единицы в последний разряд с переносом числа в следующий разряд
для моего пример Выше
N = 3
k1 = 2
k2 = 4
k3 = 2
получаем такую последовательность индексов в массиве:
1 1 1
1 1 2
1 2 1
1 2 2
1 3 1
1 3 2
1 4 1
1 4 2
2 1 1
2 1 2
2 2 1
2 2 2
2 3 1
2 3 2
2 4 1
2 4 2

Последний раз редактировалось Serge_Bliznykov; 03.01.2011 в 23:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2011, 23:23   #6
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
По умолчанию

да символ из первого списка должен быть на первом месте, из второго на втором и так далее
Как вы сформулируете вопрос так вам и ответят
xil вне форума Ответить с цитированием
Старый 03.01.2011, 23:26   #7
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Цитата:
главное, их количество...
Ну думаю,что сделать добавление в массив экземляров класса или использовать ArrayList и вопрос решится. Можно сделать метод доступа к i-тому элементу списка. А вот как сделать перебор(зная количество элементов в списке и количество списков)?.. Что-то как-то никак я не додумаю. Рекурсия не подходит...Кризис мозговой деятельности после нового года.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 04.01.2011, 01:12   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Ну в общем задача показалась интересной,подумал немного. Решил генерить списки символов(если что конструктор можно переделать). Все остальное по заданию выше.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace List
{
    class Program
    {
        static void Main(string[] args)
        {
            ListChar l = new ListChar(10);
            l.AddList(10);
            
            l.Perebor("");
            Console.ReadKey();
        }
    }
    class ListChar
    {
        private ListChar NextNode;//Ссылка на следующий узел в списке
        private char[] list;//Список символов этого узла
        private int N;//нужен только для того,чтобы определить головной ли это узел,можно использовать булеву переменную
        /// <summary>
        /// Доступный извне конструктор.Length-количество элементов в списке символов
        /// </summary>
        /// <param name="Length"></param>
        public ListChar(int Length) 
        {
            NextNode = null; N = 0;
            list = new char[Length];
            Random rand = new Random();
            for (int i = 0; i < Length; i++)
            {
                list[i] = Convert.ToChar(rand.Next(0, 255));
            }
        }
        /// <summary>
        /// Length - длина списка,текущий элемент списка
        /// </summary>
        private ListChar(int Length,int n)
        {
            NextNode=null;
            N = n;
            list = new char[Length];
            Random rand = new Random();
            for (int i = 0; i < Length; i++)
            {
                list[i] = Convert.ToChar(rand.Next(0, 255));
            }
        }
        /// <summary>
        /// Добавление нового узла
        /// </summary>
        /// <param name="Length"></param>
        public void AddList(int Length)
        {
            if (NextNode == null)//Если последний элемент
                NextNode = new ListChar(Length,N+1);
            else
                NextNode.AddList(Length);//иначе спускаемся вниз по списку
         }
        public void Perebor(string s)
        {
            if (NextNode != null)
            {
                if (N == 0)//Если это головной элемент,то обнуляем строку
                {
                    for (int i = 0; i < list.Length; i++)
                    {
                        s = list[i].ToString();
                        NextNode.Perebor(s);
                    }
                }
                else
                {
                    for (int i = 0; i < list.Length; i++)
                    {
                        s += list[i].ToString();
                        NextNode.Perebor(s);
                    }
                }
            }
            else//Если это последний элемент списка списков
            {
                for (int i = 0; i < list.Length; i++)
                {

                    Console.WriteLine(s + list[i].ToString()); 
                }
            }
        }

    }

}
По-другому не получалось. Получилось как в С++ почти,только указатели замаскерованы.) По-моему красиво.))
P.S.: Можно сделать метод,который выводит список. Ну или просто добавить в каждый конструктор после генерации что-то вроде
Код:
            string s="";
            for (int i = 0; i < list.Length; i++)
            {
                s += list[i].ToString();
            }
            Console.WriteLine("Список №" + (N + 1).ToString() + ":  " + s);
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 04.01.2011 в 12:31.
Скарам вне форума Ответить с цитированием
Старый 04.01.2011, 17:53   #9
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
По умолчанию

разобрался =)
всем огромное спасибо, особенно Serge_Bliznykov
Как вы сформулируете вопрос так вам и ответят
xil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двубуквенные сочетания 0479 Общие вопросы по Java, Java SE, Kotlin 0 07.11.2010 19:56
Java Двухбуквенные сочетания 0479 Помощь студентам 2 31.10.2010 22:59
Клавиатурные сочетания kzld Microsoft Office Excel 2 13.09.2010 14:51
Сочетания. Пaвeл Помощь студентам 2 12.03.2009 07:57