比赛 NOIP2008集训模拟4 评测结果 TTTTTTTTTTTTT
题目名称 潜入辛迪加 最终得分 0
用户昵称 辨机ZN 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2008-11-13 11:12:15
显示代码纯文本
program ex(f1,f2);
 type
  ka=record
   map:array [1..50,1..50] of shortint;
   flag:array [1..16] of boolean;
   x,y:shortint;
  end;
  zn=array [1..100000] of ka;
 var
  a:zn; f1,f2:text; i,j,k,p,l,m,n,w,q:longint;
  head,tail,wei,tot:longint; bz:boolean;
 procedure init;
  begin
   assign(f1,'syndicate.in'); reset(f1);
   assign(f2,'syndicate.out'); rewrite(f2);
   readln(n,m);
   for i:=1 to n do
    for j:=1 to n do
     read(f1,a[1].map[i,j]);
   a[1].x:=1; a[1].y:=1;
   for i:=1 to m do a[1].flag[i]:=false;
   head:=1; tail:=1; wei:=1;
  end;
 procedure bfs(p:longint);
  var
   i,j,k:longint; xx,yy:shortint;
  begin
   xx:=a[p].x; yy:=a[p].y;
   if (xx-1>0) then
    begin
     if a[p].map[xx-1,yy]=0 then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx-1; a[wei].y:=yy;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx-1,yy] in [1..m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx-1; a[wei].y:=yy;
       a[wei].flag[a[p].map[xx-1,yy]]:=true;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx-1,yy]>m)and(a[p].flag[a[p].map[xx-1,yy]-m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx-1; a[wei].y:=yy;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;

    end;
   if (xx+1<=n) then
    begin
     if a[p].map[xx+1,yy]=0 then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx+1; a[wei].y:=yy;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx+1,yy] in [1..m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx+1; a[wei].y:=yy;
       a[wei].flag[a[p].map[xx+1,yy]]:=true;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx+1,yy]>m)and(a[p].flag[a[p].map[xx+1,yy]-m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx+1; a[wei].y:=yy;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;

    end;
   if (yy-1>0) then
    begin
     if a[p].map[xx,yy-1]=0 then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy-1;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx,yy-1] in [1..m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy-1;
       a[wei].flag[a[p].map[xx,yy-1]]:=true;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx,yy-1]>m)and(a[p].flag[a[p].map[xx,yy-1]-m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy-1;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;

    end;
   if (yy+1>0) then
    begin
     if a[p].map[xx,yy+1]=0 then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy-1;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx,yy+1] in [1..m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy+1;
       a[wei].flag[a[p].map[xx,yy+1]]:=true;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
     if (a[p].map[xx,yy+1]>m)and(a[p].flag[a[p].map[xx,yy+1]-m]) then
      begin
       inc(wei);
       a[wei].map:=a[p].map;
       a[wei].x:=xx; a[wei].y:=yy+1;
       if (a[wei].x=n)and(a[wei].y=n) then begin bz:=false; exit; end;
      end;
    end;
  end;
 begin
  init;
  bz:=true;
  tot:=0;
  while bz do
   begin
    inc(tot);
    for i:=head to tail do bfs(i);
    head:=tail+1; tail:=wei;
   end;
  writeln(f2,tot);
  close(f1);
  close(f2);
 end.