Задача в Delphi

  • Автор темы Nyo
  • Дата начала
N
#1
помогите пожалуйста решить задачу в Делфи.

18. Задано конечное множество имен жителей некоторого города, причем для каждого из жителей перечислены имена его детей. Жители А и Б называются родственниками, если:
18.1. либо А — ребенок Б
18.2. либо Б — ребенок А
18.3. либо существует некий В такой, что А является родственником В, а В является родственником Б.

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">вот код:</div></div><div class="sp-body"><div class="sp-content">
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
matrix:array[0..19,1..19] of integer; // матрица сумежности для графа
visited:array[0..19] of integer; //массив пройденых точек
implementation

{$R *.dfm}
function na(a:integer):string;//функция возврата имени под номером 0..19
begin
if a=0 then
na:='1';
if a=1 then
na:='2';
if a=2 then
na:='3';
if a=4 then
na:='4';
if a=5 then
na:='5';
if a=6 then
na:='6';
if a=7 then
na:='7';
if a=8 then
na:='8';
if a=9 then
na:='9';
if a=10 then
na:='10';
if a=11 then
na:='11';
if a=12 then
na:='12';
if a=13 then
na:='13';
if a=14 then
na:='14';
if a=15 then
na:='15';
if a=16 then
na:='16';
if a=17 then
na:='17';
if a=18 then
na:='18';
if a=19 then
na:='19';
end;
procedure TForm1.FormCreate(Sender: TObject);
var i,j,k,l,m:integer;
head,tail,v:word;
queue:array[0..19] of integer;
s:string;
begin
randomize;
for i:=0 to 19 do
for j:=0 to 19 do
matrix[i,j]:=0;	  //очитска матрицы
for i:=0 to 19 do
begin
s:=na(i);
StringGrid1.Cells[i,0]:= s;			 //заполнение первой строки первой таблицы
m:=random(3);
for j:=1 to m do
begin
l:=random(20);
while l=i do
l:=random(20);
matrix[i,l]:=1;				//Заполняем матрицу сумежности(сторим граф)
matrix[l,i]:=1;
StringGrid1.Cells[i,j]:=na(l); //Заполняем рандомно количество и имена гостей
end;
end;
{Поиск в ширину для построеного графа с матрицой сумежности}
for i:=0 to 19 do
begin
for j:=0 to 19 do
begin
queue[j]:=-1;
visited[j]:=-1;
end;
queue[0]:=i;
head:=0;
tail:=1;
visited[i]:=1;
while head<tail do
begin
v:=queue[head];
head:=head+1;
for k:=0 to 19 do
if (matrix[v,k]<>0)and(visited[k]=-1) then
begin
queue[tail]:=k;
tail:=tail+1;
visited[k]:=1;
end;
end;
for l:=0 to tail do
begin
if queue[l]<>-1 then
StringGrid2.Cells[i,l]:=na(queue[l]);
end;
end;
end;

end.



что делается в последнем "цикле"?объясните плз!!!!


for i:=0 to 19 do
begin
for j:=0 to 19 do
begin
queue[j]:=-1;
visited[j]:=-1;
end;
queue[0]:=i;
head:=0;
tail:=1;
visited[i]:=1;
while head<tail do
begin
v:=queue[head];
head:=head+1;
for k:=0 to 19 do
if (matrix[v,k]<>0)and(visited[k]=-1) then
begin
queue[tail]:=k;
tail:=tail+1;
visited[k]:=1;
end;
end;
for l:=0 to tail do
begin
if queue[l]<>-1 then
StringGrid2.Cells[i,l]:=na(queue[l]);
end;

вот в нем.

Добавлено: :)