Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Komarov Alexey                       2:5020/400     11 Jul 2001  00:15:34
 To : All
 Subject : Re: Расписание
 -------------------------------------------------------------------------------- 
 
  MS>     Hyжно составить pасписание в инститyте, где много пpепадов,
  MS> гpyппы
  MS> стyдентов и аyдитоpии опpеделенной вместимости. Как это сделать?
 
 Когда то я писал такую штуку. Hо она решается не классическими алгоритмами а
 моим собственным
 вот его описание
 
 файлы 1-10 это данные для классов 1-10
 в них содержится списко предметов. После каждого предмета идет символ #, а
 затем количество часов в неделю
 
 алгоритм.  (до нельзя кривой,)
 берем формируем из файлов расписание. При этом то что в один час попадается
 несколько раз один и тот же предмет нам по барабану. Главное составить
 массив,
 который мы потом будем сортировать.
 берем проверяем все предметы по порядку. Если такой предмет в это время уже
 есть то от этого предмета идем вниз до конца расписания и ищем такой предмет
 которого еще не было в это время. Если нашли - меняем местами.
 Естественно к концу расписание обменивать нам становиться нечего и
 получаеться
 что в одно и тоже время несколько литератур и черт знает чего еще.
 в случае если предмет надо бы поменять местами - а менять то его не с чем
 идем от этого предмета вверх по расписанию этого класса и ищем предмет с
 которым можно было бы махнуться местами. Hашли? проверяем а можно ли
 записать
 в верх предмет с низу? (то есть строчка, где мы нашли предмет уже
 отсортирована
 и нам нужно проверить можно ли вставить другой предмет) если можно поменять
 эти
 два предмета совершенно безболезненно - меняем их местами.
 
 Cheshire Cat
 
 ЗЫ: чуть не забыл: после запуска проги раписание генериться в файл timetabl.
 
 отсюда начинаются файлы. прога и данные..
 
 -----------<file generate.pas>---------
 const days:array[1..6] of string[20] =('Понедельник         ',
                                       'Вторник             ',
                                       'Среда               ',
                                       'Четверг             ',
                                       'Пятница             ',
                                       'Суббота             ');
 
 type one_Day=array[1..10] of string[20];
      temp=record
        name:string[20];
        q   :byte;
      end;
 var
      tt:array[1..10,1..6] of one_Day;
      rt:array[1..40] of temp;
      qs:array[1..10,1..6] of byte;
 
 function addspace(s:string;a:byte):string;
 begin
    while length(s)<a do s:=s+#32;
    addspace:=s;
 end;
 
 procedure rclass(n:byte);
 var
      st:string;
      ch:char;
      fl:file of char;
      c:byte;
      i,j:integer;
      q:word;
 begin
      for c:=1 to 40 do
      begin
        rt[c].name:='';
        rt[c].q:=0;
      end;
      c:=1;
      st:=chr(n+48);
      if st=#58 then st:='10' else st:='0'+st;
      assign(fl,st);
      reset(fl);
      while not eof(fl) do
      begin
        read(fl,ch);
        if ch='#' then
        begin
          st:='';
          ch:=#0;
          while (ch<>#13) and (not eof(fl)) do
          begin
            read(fl,ch);
            if ch<>#13 then st:=st+ch;
          end;
          val(st,rt[c].q,i);
          inc(c);
        end else if ch<>#10 then rt[c].name:=rt[c].name+ch;
      end;
      close(fl);
      q:=0;
      for c:=1 to 40 do q:=q+rt[c].q;
      for c:=1 to 6 do qs[n,c]:=q div 6;
      for c:=1 to q mod 6 do inc (qs[n,c]);
      i:=1;j:=1;c:=1;
      while rt[c].name<>'' do
      begin
        for q:=1 to rt[c].q do
        begin
          tt[n,j][i]:=rt[c].name;
          inc(i);
          if i>qs[n,j] then
          begin
            i:=1;
            inc(j);
          end;
        end;
        inc(c);
      end;
 end;
 
 procedure printf;
 var fl:text;
     c,b:byte;
     class,ct,ct2:string;
     day:byte;
     cl:byte;
     n:byte;
 begin
      assign(fl,'timetabl');
      rewrite(fl);
      write(fl,#218);
      for c:=1 to 230 do if c mod 21=0 then write(fl,#194) else
 write(fl,#196);
      writeln(fl,#191);
      class:=#179;
      for c:=0 to 10 do
      begin
        str(c,ct);
        ct:=ct+' класс';
        if c=0 then ct:='';
        ct2:='';
        for b:=1 to (20-length(ct)) shr 1 do ct2:=#32+ct2;
        ct2:=ct2+ct;
        while length(ct2)<>20 do ct2:=ct2+#32;
        class:=class+ct2+#179;
      end;
      writeln(fl,class);
      for day:=1 to 6 do
      begin
         write(fl,#195);
         for c:=1 to 230 do if c mod 21=0 then write(fl,#197) else
 write(fl,#196);
         writeln(fl,#180);
         for n:=1 to 10 do
         begin
           class:=#179;
           if n=1 then class:=class+days[day] else
 class:=class+addspace('',20);
           class:=class+#179;
           for cl:=1 to 10 do class:=class+addspace(tt[cl,day][n],20)+#179;
           writeln(fl,class)
         end;
      end;
      write(fl,#192);
      for c:=1 to 230 do if c mod 21=0 then write(fl,#193) else
 write(fl,#196);
      writeln(fl,#217);
      close(fl);
 end;
 
 procedure make_tabl;
 var
      temp:string[20];
      c,dc,nc:byte;
      day,cl2,class,n,day2,n2:word;
      sflag:boolean;
 begin
   for day:=1 to 6 do
   begin
      for n:=1 to 10 do
      begin
        for class:=1 to 10 do
        begin
          for cl2:=class-1 downto 1 do
          begin
            sflag:=false;
            if (tt[class,day][n]=tt[cl2,day][n]) and (tt[class,day][n]<>'')
 then
            begin
              for day2:=1 to 6 do
              begin
                for n2:=1 to 10 do
                begin
                  if (day2-1)*10+n2>(day-1)*10+n then
                  begin
                    if (tt[class,day2][n2]<>'') then
                    begin
                      sflag:=true;
                      for cl2:=class-1 downto 1 do
                        if (tt[class,day2][n2]=tt[cl2,day][n]) then
                        begin
                          sflag:=false;
                          break;
                        end;
                        if sflag then
                        begin
                          temp:=tt[class,day2][n2];
                          tt[class,day2][n2]:=tt[class,day][n];
                          tt[class,day][n]:=temp;
                          break;
                        end;
                    end;
                  end;
                  if sflag then break;
                end;
                if sflag then break;
              end;
              if not sflag then
              begin
                for day2:=1 to 6 do
                begin
                  for n2:=1 to 10 do
                  begin
                    if (day2-1)*10+n2<(day-1)*10+n then
                    begin
                      if (tt[class,day2][n2]<>'') then
                      begin
                        sflag:=true;
                        for cl2:=class-1 downto 1 do
                          if (tt[class,day2][n2]=tt[cl2,day][n]) then
                          begin
                            sflag:=false;
                            break;
                          end;
                          if sflag then
                          begin
                            for cl2:=1 to 10 do
                            begin
                              if tt[class,day][n]=tt[cl2,day2][n2] then
                              begin
                                sflag:=false;
                                break;
                              end;
                            end;
                          end;
                          if sflag then
                          begin
                            temp:=tt[class,day2][n2];
                            tt[class,day2][n2]:=tt[class,day][n];
                            tt[class,day][n]:=temp;
                            break;
                          end;
                      end;
                    end;
                    if sflag then break;
                  end;
                  if sflag then break;
                end;
              end;
              if not sflag then
              begin
                nc:=10;
                if (day=6) and (class=3) then
                   day:=6;
                for c:=1 to 6 do
                  if qs[class,c]<nc then
                  begin
                    nc:=qs[class,c];
                    dc:=c;
                  end;
                  inc(qs[class,dc]);
                  inc(nc);
                  tt[class,dc][nc]:=tt[class,day][n];
                  tt[class,day][n]:=' ';
              end;
            break;
          end;
        end;
      end;
    end;
   end;
 end;
 var c:byte;
 begin
   for c:=1 to 10 do rclass(c);
   make_tabl;
   printf;
 end.
 
 -----------<end of file generate.pas>-----------
 
 Далее идут входные данные.
 
 -----------<file 01.pas>---------
 Математика #3
 Русский Язык #3
 Литература #3
 Физкультура #1
 Рисование #1
 Музыка #1
 -----------<end of file 01.pas>---------
 -----------<file 02.pas>---------
 Математика #3
 Русский Язык #2
 Литература #2
 Физкультура #1
 Рисование #2
 Музыка #1
 Труд #2
 -----------<end of file 02.pas>---------
 -----------<file 03.pas>---------
 Математика #4
 Русский Язык #2
 Литература #2
 Физкультура #2
 Рисование #2
 Музыка #2
 Труд #2
 -----------<end of file 03.pas>---------
 -----------<file 04.pas>---------
 Математика #5
 Русский Язык #2
 Литература #1
 Физкультура #2
 Рисование #2
 Музыка #1
 Труд #2
 История #2
 -----------<end of file 04.pas>---------
 -----------<file 05.pas>---------
 Алгебра #2
 Геометрия #2
 Русский Язык #1
 Литература #1
 История #2
 Физкультура #1
 Рисование #1
 Музыка #1
 Труд #2
 -----------<end of file 05.pas>---------
 -----------<file 06.pas>---------
 Алгебра #2
 Геометрия #2
 Русский Язык #1
 Литература #3
 Физкультура #2
 Труд #2
 Физика #2
 Биология #2
 -----------<end of file 06.pas>---------
 -----------<file 07.pas>---------
 Алгебра #4
 Геометрия #2
 Русский Язык #1
 Литература #1
 Физкультура #1
 Труд #2
 Физика #2
 Биология #2
 Физика #2
 -----------<end of file 07.pas>---------
 -----------<file 08.pas>---------
 
 Алгебра #2
 Геометрия #2
 Русский Язык #1
 Литература #1
 Физкультура #1
 Труд #2
 Физика #3
 Биология #1
 Физика #2
 Ин. Яз #2
 -----------<end of file 08.pas>---------
 -----------<file 09.pas>---------
 Алгебра #2
 Геометрия #2
 Литература #2
 Физкультура #1
 Труд #2
 Физика #2
 Биология #3
 Химия #3
 Физика #2
 Ин. Яз #2
 Информатика #2
 -----------<end of file 09.pas>---------
 -----------<file 10.pas>---------
 Алгебра #3
 Геометрия #1
 Литература #1
 Физкультура #1
 Труд #2
 Физика #2
 Биология #1
 Физика #2
 Ин. Яз #2
 Информатика #2
 Химия #3
 Астрономия #2
 ОБЖ #2
 -----------<end of file 10.pas>---------
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Расписание   Mihail Sokolov   21 Jun 2001 12:13:30 
 Расписание   Ilya Morkovin   22 Jun 2000 19:55:00 
 Расписание   Roman Klin   25 Jun 2001 17:12:27 
 Расписание   Ilya Morkovin   27 Jun 2001 02:33:00 
 Re: Расписание   Vadim Goncharov   27 Jun 2001 15:39:26 
 Расписание   Roman Klin   28 Jun 2001 07:00:38 
 метод ветвей и границ   Sergey Smirnov   29 Jun 2001 04:34:08 
 Re: метод ветвей и гpаниц   Vadim Goncharov   01 Jul 2001 22:24:25 
 Re: Расписание   Vadim Goncharov   29 Jun 2001 23:49:08 
 Генетика...   Vasily Shmelev   11 Jul 2001 10:14:54 
 Re: Генетика...   Vadim Goncharov   12 Jul 2001 13:50:33 
 Генетика...   Yuri Burger   13 Jul 2001 23:15:32 
 Расписание   Denis Mezhevich   28 Jun 2001 23:26:02 
 Re: Расписание   Vadim Goncharov   01 Jul 2001 22:25:55 
 Расписание   Ilya Morkovin   03 Jul 2001 20:30:00 
 Расписание   Ilya Morkovin   28 Jun 2001 00:27:00 
 Re: Расписание   Alexey Desyatnik   28 Jun 2001 11:56:50 
 Расписание   Alexei Frounze   23 Jun 2001 08:22:08 
 Расписание   Ilya Morkovin   24 Jun 2001 18:39:00 
 Расписание   Denis Mezhevich   24 Jun 2001 23:32:40 
 Расписание   Alexei Frounze   26 Jun 2001 00:24:05 
 Расписание   Ilya Morkovin   27 Jun 2001 02:32:00 
 Расписание   Ilya Morkovin   28 Jun 2001 00:26:00 
 Re: Расписание   Alex Svetlov   24 Jun 2001 01:35:50 
 Re: Расписание   Komarov Alexey   11 Jul 2001 00:15:34 
Архивное /ru.algorithms/65778b9f6889.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional