program graphomaton; const deg = 3; type pvertex = ^vertex; vertex = record s: array [1..deg] of pvertex; p: array [1..deg] of 1..deg; stop: boolean; x: 0..1; y: 0..1; { = 0 } prev: 0..1; { = 0 } i: 1..3; { = 0 } end; procedure init(vv: pvertex); begin with vv^ do begin prev := 0; y := 0; end; end; procedure dump(vv: pvertex); begin with vv^ do begin write(' prev=', prev); write(' y=', y); end; end; procedure run(vv: pvertex); begin with vv^ do begin stop := false; prev := y; if x=1 then y := 1; for i := 1 to 3 do if s[i]^.y <> 0 then y := 1; if y = prev then stop := true; end; end; { Runtime library for the graphomaton (c) 2006 Martin Mares } const MAXN = 100; var V, Vprev: array [1..MAXN] of vertex; E: array [1..MAXN, 1..deg] of 1..deg; N: 0..MAXN; procedure read_in; var i, j, k: integer; begin read(N); for i:=1 to N do begin for j:=1 to deg do read(E[i,j]); read(V[i].x); end; for i:=1 to N do begin for j:=1 to deg do begin V[i].s[j] := @V[E[i,j]]; k := 1; while (k <= deg) and (E[E[i,j],k] <> i) do inc(k); if k > deg then begin writeln('Input inconsistent: no opposite edge for ', i, '#', j); halt(1); end; V[i].s[j] := @Vprev[E[i,j]]; V[i].p[j] := k; end; init(@V[i]); end; end; procedure dump_all; var i, j: integer; begin for i:=1 to N do begin write(i); { write(' ('); for j:=1 to deg do begin if j>1 then write(','); write(E[i,j]); end; write(')'); } write(#9, 'x=', V[i].x); dump(@V[i]); writeln(' stop=', ord(V[i].stop)); end; end; procedure iterate; var i, it, nstop: integer; begin; it := 0; writeln('### Initial configuration ###'); dump_all; repeat inc(it); nstop := 0; Vprev := V; for i := 1 to N do begin run(@V[i]); if V[i].stop then inc(nstop); end; writeln('### Iteration ', it, ' ###'); dump_all; until nstop = N; end; begin read_in; iterate; end.