Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615

Перебор всевозможных комбинаций, изменяемая длина и диапазон

13.11.2015, 22:35. Показов 6087. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обгуглился уже, где - то может и видел то, что нужно, но в силу тупизны счёл не тем.

Брут в общем.
Есть длина строки, массив с символами, и буфер для вывода.

Моя попытка:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void tratata()
{
    int file = fopen("pass.txt", "w+");
    
    char s[] = {'1', '2', '3'};
    char b[] = "   ^n";
    int z = sizeof(s);
    int n[3];
    
    while(1)
    {
        b[0] = s[n[0]];
        b[1] = s[n[1]];
        b[2] = s[n[2]];
        
        if(++n[2] >= z);
        {
            if(++n[1] >= z);
            {
                if(++n[0] >= z);
                {
                    fputs(file, b);
                    break;
                }
                n[1] = 0;
            }
            n[2] = 0;
        }
        fputs(file, b);
    }
    fclose(file);
}

Вот так красиво от 111 до 333 записывает.
Кликните здесь для просмотра всего текста
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333


Но проблема в чём, неизвестно сколько будет длина строки.

И не в том даже дело, что код большой будет при например 10+ символов, а в том что он не будет работать для меньшей длины.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2015, 22:35
Ответы с готовыми решениями:

Перебор всевозможных комбинаций слов
Доброго времени суток, уважаемые форумчане! Прошу помочь с программой! Цель программы: перебор всевозможных комбинаций слов из...

Перебор всевозможных комбинаций символов строки, исправить код
Увидел код с подбором цифр... решил буквы добавить, но вышла ошибка... Пожалуйста, скажите как правильно это сделать? using System;...

Генерация всевозможных комбинаций
Здравствуйте! Возникла следующая задача: есть таблица, в каждой строчке находится разное число не пустых ячеек , но при этом колчество...

12
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
13.11.2015, 23:06
NEXT_PERMUTATION ИЩИТЕ В ИНТЕРНЕТЕ

Добавлено через 17 секунд
ой капс
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 00:14  [ТС]
Да не, это не то

C++ (Qt)
1
next_permutation( ИТЕРАТОР_НАЧАЛА_МАССИВА, ИТЕРАТОР_КОНЦА_МАССИВА );
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
14.11.2015, 00:17
я не совсем понял чего вы хотите
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 00:28  [ТС]
Мне нужна динамическая длина строки.

Уже часа 2 сижу думаю, как без переключателей делать:

До этого я делал массив длиной в размер строки, и методом проверок добивался чтобы они считались попеременно.

А когда длина неизвесна(нет ну в конце концов она извесна) неполучится создать массив с таким же размером.
А если и создастся то это всё равно неважно, проверки сами не подставятся до определённой длины.

Пробую через цикл делать - ничего не выходит.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
while(1) // строки
{
    int i = z // размер
        
    while(--i > -1) // символы
    {
        b[i] = c[n[i]] // Записывается символ в буфер
        // Тут нужно посчитать последнюю ячейку, проверить что она не на пределе
            
    }
    fputs(file, b)
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
14.11.2015, 00:54
Пара строк - и все удовольствие. Но можно и дубово через n вложенных циклов (если максимальное n известно заранее), но в каждом проверять - надо ли вваливаться внутрь.
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
 
void f(int i, char *s, char *r) {
    if (s[i]) for(int j=0; s[j]; ++j) {r[i]=s[j]; f(i+1,s,r);} else {r[i]=0; cout<<r<<'\n';}}
 
int main() {char s[] = "abcd", r[sizeof(s)]; f(0,s,r); return 0;}
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 01:57  [ТС]
Я написал )

Правда не на С++...

Ну и не создать переменную, это жаль...

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <amxmodx>
 
public plugin_init()
{
    new file = fopen("addons/pass.txt", "w+")
    
    new abc[3] = {'1', '2', '3'}
    
    new const numchar = 4   // Длина строки
    
    new x = sizeof(abc) // Размер словаря
    new z = x - 1       // Максимальный размер счётчика
    new n[5]        // numchar + 1 счётчик
    n[numchar] = x      // Дополнительная ячейка всегда должна быть максимально
    new buffer[6] = "    ^n"    // numchar + 2 буфур для записи
    new numstr = 1      // Количество строк ++
    new s = -1      // Счётчик строк
    
    while(++s < numchar) numstr *= x // Получение количества строк
    
    s = -1
    
    while(++s < numstr)     // Строки
    {
        new i = numchar     // Сброс счётчика символов
        
        while(--i > -1)     // Символы
        {
            if(n[i] > z) n[i] = 0       // Если счётчик символов вылез за размер, установить 0
            
            buffer[i] = abc[n[i]]       // Запись символа в ячейку
 
            if(n[i + 1] > z) n[i]++     // Если предыдущий счётчик вылез за размер, считать текущий
        }
        fputs(file, buffer)
    }
    fclose(file)
}
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
14.11.2015, 03:10
Лучший ответ Сообщение было отмечено артист как решение

Решение

артист, может еще нужно: Все возможные перестановки букв слова - нужен алгоритм
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 04:37  [ТС]
Не, мне не так нужно:
acb
abc
bac
bca
cba
cab
А так:
aaa
aab
aac
aba
abb
abc
aca
acb
acc
и тд...
Добавлено через 1 час 13 минут
Что - то я не пойму как она работает...

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void f(int i, char *s, char *r)
{
    if(s[i])
    {
        for(int j = 0; s[j]; ++j)
        {
            r[i] = s[j];
            f(i + 1, s, r);
        }
    }
    else
    {
        r[i] = 0;
        cout << r << '\n';
    }
}
Выдаёт все одно и то же, aaa dddd...

Как можно задать размер после того как создан массив?

Есть переменная:

int dfg = 5

Можно как - то через неё задать размер?

Типа такого:

int dfg = 5
int blfd[dfg]

?

И еще хотел спросить, вот я char цифрами забил, так проще потому что.
C++ (Qt)
1
2
3
4
5
6
7
8
9
char dictionary[6][33] =
{
    {97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122},                             //{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}
    {65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90},                                                    //{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'},
    {192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223},  //{'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'},
    {224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255},  //{'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'},
    {48,49,50,51,52,53,54,55,56,57},                                                                                                    //{'0','1','2','3','4','5','6','7','8','9'},
    {33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,58,59,60,61,62,63,64,91,92,93,94,95,96,123,124,125,126}                               //{'!',''','#','$','%','&',''','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\',']','^','_','`','{','|','}','~'}
};
И там варнинги дуром прут, как правильно сделать?
Чтобы и цифрами вбить, и была строка, вернее это не цифры а юникод, ну я думаю и так понятно...
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
14.11.2015, 13:52
Лучший ответ Сообщение было отмечено артист как решение

Решение

артист, вот, наваял свой велосипед, по-моему оно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int k = 0;
 
//may the Force be with you
void brute_print(string &s, const string &alphabet, int depth)
{
    if (depth == 0)
    {
        for (unsigned int i = 0; i < alphabet.length(); i++)
        {
            k++;
            s[s.length() - depth - 1] = alphabet[i];  //s.length() - depth - 1 можно заменить на depth, но будет другой порядок
            cout << s << endl;
        }
 
        return;
    }
 
    for (unsigned int i = 0; i < alphabet.length(); i++)
        {
            s[s.length() - depth - 1] = alphabet[i];   //s.length() - depth - 1 можно заменить на depth, но будет другой порядок
            brute_print(s, alphabet, depth - 1);
        }
}
 
int main()
{
    string s = "aaaa";
    string alphabet = "abc";
 
    brute_print(s, alphabet, s.length() - 1);
    cout << "k = " << k << endl;
 
    return 0;
}
k - количество комбинаций

Добавлено через 5 минут
C++
1
char dictionary[6][33]
заменить на
C++
1
wchar_t dictionary[6][33]
при этом подключив wchar.h

Добавлено через 10 минут
переменная длина:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    string s = "aaa";
    string alphabet = "abc";
    for (int i = s.length(); i > 0; i--)
    {
        s = s.substr(0, i);
        brute_print(s, alphabet, s.length() - 1);
        cout << "k = " << k << endl;
        k = 0;
    }
 
    return 0;
}
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 18:13  [ТС]
Ругается на объявление функции:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "Created Dictionaries.h"
#include <windowsx.h>
//#include <windows.h>
#include <commdlg.h>
//#include "Shlwapi.h"
//#include <stdio.h>
//#include <time.h>
 
#include <sstream>
#include <iostream>
 
void brute_print(string &s, const string &alphabet, int depth);
error C2065: string: не объявленный идентификатор
error C2065: s: не объявленный идентификатор
error C2059: синтаксическая ошибка: const
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
14.11.2015, 18:58
Лучший ответ Сообщение было отмечено артист как решение

Решение

артист, либо вначале файла вставить
C++
1
using namespace std;
либо вот (+поправил кое-чего):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <algorithm>
 
int k = 0;
 
void brute_print(std::string &s, const std::string &alphabet, int depth)
{
    if (depth == 0)
    {
        for (unsigned int i = 0; i < alphabet.length(); i++)
        {
            k++;
            s[s.length() - depth - 1] = alphabet[i];
            std::cout << s << std::endl;
        }
 
        return;
    }
 
    for (unsigned int i = 0; i < alphabet.length(); i++)
        {
            s[s.length() - depth - 1] = alphabet[i];
            brute_print(s, alphabet, depth - 1);
        }
}
 
int main()
{
    std::string initial = "aaa";
    std::string alphabet = "abc";
    for (int i = initial.length(); i > 0; i--)
    {
        std::string s = initial.substr(0, i);
        brute_print(s, alphabet, s.length() - 1);
        std::cout << "\nk = " << k << std::endl << std::endl;
        k = 0;
    }
 
    return 0;
}
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2015, 20:49  [ТС]
Ага оно самое, спасибо большое )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2015, 20:49
Помогаю со студенческими работами здесь

Получение всевозможных комбинаций массива
необходимо получить всевозможные комбинации массива Исх. массив : 1,2,3 Комбинации : 1,2,3; 1,3,2; 2,1,3 и т.д.

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

Вывести максимальное произведение из всевозможных комбинаций по 2 числа из 5 чисел
Вывести максимальное произведение из всевозможных комбинаций по 2 числа из 5 чисел.

Перебор всевозможных состояний массива
Доброго времени суток. Задача: Дан двумерный массив(скажем, 4х4) заполненный рандомным образом числами, причем числа могут быть только...

Посчитать вероятности конкретных комбинаций соседних клеток для всевозможных состояний кубика Рубика
Добрый день. Я программист и разрабатываю игру, которая основана на реальной механике работы кубика рубика. Вкратце: - Кубик...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru