Hola, te dejo un ejemplo de rotacion de arrays. Trata el tema de manera general, para que veas la idea. Las excepciones (ej, menos choferes que sitios o descansos extras) no se contemplan.
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
chofers : array of string;
sitios : array of string;
desfase : integer;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
df : integer;
ls : integer;
begin
setlength(chofers,27);
for i := 0 to length(chofers) - 1 do
chofers[i] := 'chofer ' + inttostr(i);
setlength(sitios,15);
for i := 0 to length(sitios) - 1 do
sitios[i] := 'sitio ' + inttostr(i);
df := length(chofers) - length(sitios);
ls := length(sitios);
if df > 0 then
begin
setlength(sitios,length(chofers));
for i := ls to length(sitios) - 1 do
begin
sitios[i] := 'descanso por falta de sitios';
end;
end;
desfase := 0;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
Memo1.Lines.Clear;
for i := 0 to Length(sitios) - 1 do
Memo1.Lines.Add(chofers[i] + ' ' + sitios[(i + desfase) mod Length(sitios)]);
inc(desfase);
end;
lo que hace es : crea tantos descansos como choferes que se quedan sin sitio (matriz cuadrada, que decias), asigna a cada chofer un sitio, rotando este segun un desfase (cada semana, por ejemplo, en el ejemplo es a cada click). Un saludo y a ver si te sirve.
NOTA : al finalizar el programa, se tendria q liberar chofers y sitios.