Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача со скобками 
:(
    Опции темы
Naruto05
Дата 26.4.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



здр всем кто читает. У меня есть задачка:
Так вот, дана строка, состоящая из символов '?' и '(' и ')'.
Требуется вывести все варианты преобразованной строки, где вместо вопросов стоят  '(' или ')' и полученное скобочное выражение правильное.
например: (??)
ответ: (())
()()

Добавлено через 1 минуту и 59 секунд
А, кстати, длина строки составляет 254 символа

ну вот я её решал рекурсивным перебором, но она тяжело работала уже на 40-50 символах.
PM MAIL   Вверх
Dobermann
Дата 26.4.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Вообщем здесь изначально нужен стек, для проверки правильности расстановки скобочной последовательности.
Вот пример:
Код

type Stack=object
privat
   m: array[1..1000] of char;
   top: word;
public
  procedure Init;
  procedure Push(s: char);
  proceudre Pop;
  function Peek: char;
  function Empty: boolean;
end;
  procedure Stack.Init;
     begin top:=0; end;
  procedure Stack.Push;
    begin inc(top); m[top]:=s end;
  procedure Stack.Pop;
    begin dec(top) end;
  function Stack.Peek;
    begin peek:=m[top] end;
  function Stack.Empty;
    begin empty:=top=0 end;
var Stk: stack;
         s: char;
         Err: boolean;
begin  err:=false; stk.init;
    write('>'); read(s);
    while s <> '.' do begin
          if not (s in ['(',')']) then
          else if s='(' then stk.push(')')
          else stk.empty then err:=true
          else stk.peek <>s then err:=true
          else stk.pop;
          read(s) 
    end;
else not err and str.empty then
writeln('norm') else writeln('error');
readln
end.

Ну а для реализации твоей задачи тебе нужна функция проверки количества '?' на четность и вставить её в обект.
PM   Вверх
volvo877
Дата 26.4.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Dobermann @  26.4.2008,  16:31 Найти цитируемый пост)
здесь изначально нужен стек, для проверки правильности расстановки скобочной последовательности.
Обычной пробежкой по символам с увеличением уменьшением числа ОТКРЫТЫХ скобок это делается гораздо быстрее...

(()(?)?) - количество "вопросов" - парное, и что мне это дает? Можно же сделать: (()())(), что будет корректно, а можно: (()(()() - что ошибочно... Тогда к чему эта проверка на четность? Просто так?

Naruto05, показывай, как ты делал, у меня на 80 символах программа (с рекурсией) отработала за 100 ms...
PM MAIL   Вверх
Dobermann
Дата 26.4.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Начнем от противного: а если их 3,5,7, (n mod 2 <>0), то тогда что?! тупо вывод 'количество знаков '?' не четное' ?
Согласись ведь каждой открывающей скобке должна соответствовать закрывающая......
Просто посмотри в код: там идет проверка правильности написания скобочной последовательности......
PM   Вверх
Naruto05
Дата 26.4.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



var
   b:array[1..2] of char;
   c:array[1..255] of byte;
   s,s1:string;
   g,k,l,m,n,p:integer;
   f:text;

procedure output(qw:boolean);
var
   m:byte;
begin
     if qw then begin
        writeln(f);
        for m:=1 to n-1 do
            write(f,s[m]);
     end else
     begin
          write(f,'NO');halt;
     end;
end;

procedure input;
begin
     assign(f,'r953.in');reset(f);
     read(f,s);
     close(f);

     assign(f,'r953.out');rewrite(f);
     if length(s) mod 2=1 then output(false);
     s1:=s;
     writeln(f,'YES');

     s:=s+'?';n:=length(s);p:=0;l:=0;g:=0;
     for k:=1 to n do
         if s[k]='?' then begin
            inc(p);c[p]:=k;
         end else
         if s[k]='(' then inc(l) else inc(g);

     b[1]:='(';b[2]:=')';
end;

procedure solve(x:byte);
var
   i,j:byte;
begin
     if (l<g) then exit;

     if (x=p)and(l=g)and(s[1]='(')and(s[n-1]=')') then output(true);
     if x=p then exit;

     for i:=1 to 2 do begin
         if i=1 then inc(l) else inc(g);
         s[c[x]]:=b[i];
         solve(x+1);
         if i=1 then dec(l) else dec(g);
     end;

     s[c[x]]:='?';
end;

begin
     writeln('-------------------------');
     input;
     solve(1);
     close(f);
end.



Ну вот. ну она не работает, на некоторых выражениях она ошибается.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1006 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.