>
> Суть проблемы: жизненно необходимо написать программу на городской
> конкурс, которая создает школьное расписание, учитывая сложность
> предметов.
Я считаю, что если ты пишешь программу на городской конкурс, то её надо
писать самому, а не привлекать людей со стороны. Нет, мелочи какие-нибудь
можно спросить . . . Как ты считаешь, алгоритм лёгкий, ТАК САМ НАПИШИ ЕГО!
Причем как я понимаю, именно сортировка является центром программы!
Может её ещё за тебя всю программу написать и с ней на городском конкурсе
выступить.
Но в принципе, задача интересная, и я попытался решить её:
Решал её я на Паскале, методом перебора.
Гарантия, что всё ОК будет 100%, а вот время выполнение не очень.
Program sort;
uses crt;
const
colP=6; {Количество придметов всего}
colDay=6;{количестов дней всего}
colLes=3;{Количество уроков в день}
type lesson= record
name:string;
bal:integer;
end;
var
i,j:integer;
mLes:array [0..colp] of Lesson;
WorkRasp,TempRasp:array[1..Colday,1..colLes] of integer;
zanit:array[1..colp] of boolean;
MAX:integer;
function MognoDalee:boolean;
var
i,j:integer;
MAxI,MinI:integer;
summa:INteger;
begin
MAxi:=0;
MinI:=$FFF;
for i:= 1 to colDay do
begin
summa:=0;
for j:= 1 to colLes do
begin
inc(summa,Mles[temprasp[i,j]].bal);
if Mles[temprasp[i,j]].bal=0 then
summa:=0;
end;
if summa<>0 then
begin
if summa> MaxI then Maxi:=summa;
if summa < MinI then MinI:=summa;
end;
end;
maxi:=MaxI-MinI;
if maxi>Max then MognoDalee:=false else MognoDalee:=true;
end;
function VSE:boolean;
var
result:boolean;
i:integer;
begin
result:=true;
for i:= 1 to colp do
if not zanit[i] then result:=false;
Vse:=result;
end;
procedure anal;
var
i,j:integer;
Summa,MaxI,MinI:integer;
begin
FillcHar(zanit,sizeof(zanit),0);
Maxi:=0; MinI:=$FFF;
for i:= 1 to colDay do
begin
summa:=0;
for j:= 1 to colLes do
begin
inc(summa,Mles[temprasp[i,j]].bal);
zanit[temprasp[i,j]]:=true;
end;
if summa> MaxI then Maxi:=summa;
if summa < MinI then MinI:=summa;
end;
MaxI:=MaxI-MinI;
if (MaxI<Max) and (vse) then
begin
MOve(TempRasp,WorkRasp,sizeof(TempRasp));
max:=MaxI;
end;
end;
procedure Ser(d,l:byte);
Var
les:byte;
begin
les:=0;
if MognoDalee then
repeat
inc(les);
tempRasp[d,l]:=les;
if (d=colday) and (l=colLes) then
anal else
begin
if l < colles then ser(d,l+1);
if l =colles then ser(d+1,1);
end;
until les=ColP;
end;
begin
mles[0].bal:=0;
mLes[1].name:='Ruski';
mLes[1].bal:=10;
Mles[2].name:='Phizik';
Mles[2].bal:=11;
Mles[3].name:='Matimatik';
Mles[3].bal:=12;
Mles[4].name:='Histori';
Mles[4].bal:=13;
Mles[5].name:='Fiz-ra';
Mles[5].bal:=5;
Mles[6].name:='Trud';
Mles[6].bal:=4;
Max:=$FFF;
ser(1,1);
clrscr;
for i:= 1 to colDay do
begin
gotoXY(i*10,1);
writeln('Day # ',i,' : ');
for j:= 1 to colLes do
begin
gotoxy(i*10,j+2);
write(Mles[workRasp[i,j]].name);
end;
end;
writeln;
writeln('Разность между самы загр и разгруж днями: ', max);
readln;
end.
В программе стоят данные в разделе Const, таки с которыми реально дождаться
результата.
А тебе нужен РАБОЧИЙ алгоритм, так что тебе придётся его переделать или
доработать.
По моемому, повысит время выполнения можно улучшав функцию MognoDalee;
Или как-нибудь код отредактировать.
Я писал на скорую руку, так что стиль не КРИТИКУЙТЕ.
P.S Программу я тестировал не очень доброкачественно, могут быт и ошибки.
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru