С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578

Слишком долгий перебор - нужно оптимизировать

28.04.2011, 18:42. Показов 1152. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача с ацмп.ру:
Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок.

Задача легкая, но в голову что-то ничего не лезет. Написал алгоритм, но при крайних значениях работает слишком долго:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <fstream>
#include <stack>
#include <string>
 
using namespace std;
 
int N;
ifstream cin("INPUT.TXT");
ofstream cout("OUTPUT.TXT");
 
void recurse(string S);
 
int main()
{
    cin >> N;
    recurse("");
    return 0;
}
 
void recurse(string S)
{
    if (S.length()==N)
    {
        stack <char> G;
        bool flag=1;
        for (int i=0;i<S.length();i++)
        {
            if (S[i]=='(' || S[i]=='[') G.push(S[i]);
            else
            {
                if (!G.empty())
                {
                    if ((S[i]==')' && G.top()=='(') || (S[i]==']' && G.top()=='[')) G.pop();
                    else flag=0;
                }
                else
                {
                    flag=0;
                }
            }
        }
        if (G.empty() && flag)
            cout << S << endl;
    }
    else
    {
        int q=0,r=0;
        for (int i=0;i<S.length();i++)
            switch (S[i])
            {
                case '(':
                    r++;
                    break;
                case '[':
                    q++;
                    break;
                case ')':
                    r--;
                    break;
                case ']':
                    q--;
                    break;
            }
        if (q>=0 && r>=0)
        {
            recurse(S+'(');
            recurse(S+'[');
            recurse(S+')');
            recurse(S+']');
        }
    }
}
Помогите в поисках метода оптимального перебора!
Заранее спасибо!

ЗЫ: Сорри за быдлокод, ясно, что оно смотрится некрасиво, но я так думаю, что он неправильный, вот и не стал его оформлять нормально
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2011, 18:42
Ответы с готовыми решениями:

Оптимизировать перебор
Неделю учу С++, так что прошу не гадить. Надо уменьшить время работы. Задача: Вступление — Брат мой, Магистр Ордена хочет узнать...

Слишком долгий отклик
Добрый день, проблема следующая, накатил на машину 100% рабочий образ системы, все работает кроме одного, сетевой интерфейс очень тупит, а...

Слишком долгий первый ответ
Добрый день, я не уверен, что проблема именно в Апаче, но нужно исключать возможные причины по одной. После того, как на сервер не было...

6
 Аватар для olleg90
40 / 40 / 12
Регистрация: 06.01.2011
Сообщений: 90
29.04.2011, 11:35
лень переделывать))

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
#include<stdio.h>
#include<string.h>
#include<Ctype.h>
int main()
  { char *opsk="({[";
    char *clsk=")}]";
    FILE *in=fopen("brackets.in","r");
    FILE *out=fopen("brackets.out","w");
    int k,i,j,l,fl;
   char str[100],a[100];
   fscanf(in,"%d\n",&k);
    for ( i=1;i<=k;i++)
    {
      fgets(str,100,in); l=fl=0;
      for ( j=0;j<strlen(str);j++)
    if(strchr(opsk,str[j]))
     if(j+1<strlen(str) && isdigit(str[j+1])||strchr(opsk,str[j+1]))
       a[l++]=str[j] ;
       else { fl=1; break;}
    else
     if(strchr(clsk,str[j]))
      if(l<=0) { fl=1; break;}
       else
        if (strchr(clsk,str[j])-clsk!=strchr(opsk,a[l-1])-opsk)
          { fl=1;  break;}
          else
           if(isdigit(str[j-1])||strchr(clsk,str[j-1]))
           l--;
           else fl=1;
 
       if (fl==0)
     if (l==0)fprintf(out,"RIGHT\n");
     else fprintf(out,"WRONG\n");
       else fprintf(out,"WRONG\n");
 
    }
 
    }
0
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578
29.04.2011, 12:58  [ТС]
Этот код проверяет, правильная СП или нет, я правильно понял? Если да, то это не совсем то. У меня работает программа, правильно, но очень медленно. Поэтому я спрашиваю о сокращении перебора.
0
 Аватар для olleg90
40 / 40 / 12
Регистрация: 06.01.2011
Сообщений: 90
29.04.2011, 13:03
она проверяет правильность расстановки скобок в выражении
0
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578
29.04.2011, 15:27  [ТС]
Надо бы как-то сократить перебор... Проверка расстановки скобок в моем коде тоже есть...
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
29.04.2011, 15:34
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
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <fstream>
#include <vector>
 
using namespace std;
 
ifstream cin("input.txt");
ofstream cout("output.txt");
 
int n;
 
vector<char> v;
vector<char> ans;
 
void p(int pos)
{
    if(pos == n)
    {
        for(int i = 0; i < n; i++)
            cout << ans[i];
        cout << endl;        
        return;
    }
    if(n - pos - v.size() > 0)
    {
        v.push_back('(');
        ans[pos] = '(';
        p(pos+1);
        v.pop_back();
 
        v.push_back('[');
        ans[pos] = '[';
        p(pos+1);
        v.pop_back();
    }
    if(v.size() > 0)
    {
        char buf = v.back();
        if(buf == '[')
            ans[pos] = ']';
        else
            ans[pos] = ')';
        v.pop_back();
        p(pos+1);
        v.push_back(buf);
    }
}
 
int main()
{
    cin >> n;
    ans.resize(n);
    p(0);
}
1
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578
29.04.2011, 15:53  [ТС]
Хохол, премного благодарен. Мне преподаватель про этот метод намекнул, но я чето не въехал, как его использовать (с одним массивом чаров). Теперича разобрался и акцептед.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2011, 15:53
Помогаю со студенческими работами здесь

Слишком долгий ajax jsonp запрос
Здравствуйте. Почему долго посылается ajax jsonp запрос на сервер? Вот код, который я использую: JavaScript $.ajax({ type:...

Слишком долгий первый GET_HTTP запрос
Доброго времени суток. Столкнулся с такой проблемой: У меня есть функция public string GET_HTTP(string url) { ...

Оптимизировать время выполнения (перебор)
Есть долгая, закрученная задача: Вступление — Брат мой, Магистр Ордена хочет узнать завтра о результатах наших многолетних изысканий....

Нужно оптимизировать
Есть задание, есть готовый код. Но он не проходит скоростной режим, нужно оптимизировать, помогите плз) #include...

Змейка. Нужно оптимизировать
Написал игру &quot;Змейка&quot;,вернее скоро напишу. Вся проблема в том,что я не могу ее нормально оптимизировать. #include &quot;pch.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru