比赛 NOIP2008集训模拟4 评测结果 AAAAAWAATATTA
题目名称 潜入辛迪加 最终得分 69
用户昵称 苏轼 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2008-11-13 10:51:16
显示代码纯文本
program cch(input,output);
const
 xx:array[1..4] of integer=(-1,0,1,0);
 yy:array[1..4] of integer=(0,1,0,-1);
type
 sz=array[0..20] of integer;
 ch=record
     x:integer;
     y:integer;
     k:longint;
     s:sz;
    end;
var
 tmps:sz;
 map,map1:array[1..50,1..50] of integer;
 i,j,n,x1,y1,m,head,tail,k,k1:longint;
 a:array[1..100000] of ch;

function rp(s:sz;k:integer):boolean;
var
 i:integer;
begin
 for i:=1 to s[0] do
  if s[i]=k then exit(true);
 exit(false);
end;

function check(x,y:integer; s:sz):boolean;
var
 i:longint;
 flag:boolean;
begin
 for i:=1 to tail do
  if (a[i].x=x)and(a[i].y=y) then
   begin
    flag:=true;
    if a[i].s[0]=s[0] then
     begin
      for j:=1 to a[i].s[0] do
       if a[i].s[j]<>s[j] then
        begin
         flag:=false;
         break;
        end;
      if flag then exit(false);
     end;
   end;
 exit(true);
end;

procedure ins(x:integer);
var
 i,j:integer;
begin
 j:=tmps[0];
 while (j>0)and(tmps[j]>x) do dec(j);
 for i:=tmps[0] downto j+1 do tmps[i+1]:=tmps[i];
 tmps[j+1]:=x;
 inc(tmps[0]);
end;

begin
 assign(input,'syndicate.in');
 assign(output,'syndicate.out');
 reset(input);
 rewrite(output);
 readln(n,m);
 for i:=1 to n do
  for j:=1 to n do
   read(map1[i,j]);
 for i:=1 to n do
  for j:=1 to n do map[i,j]:=map1[i,j];
 for i:=1 to n do
  for j:=1 to n do
   if map1[i,j]=-2 then
     for k:=1 to 4 do
      begin
       x1:=i+xx[k]; y1:=j+yy[k];
       if (x1>=1)and(x1<=n)and(y1>=1)and(y1<=n) then
        if map[x1,y1]=0 then map[x1,y1]:=-2;
      end;
 head:=1; tail:=1;
 a[1].x:=1; a[1].y:=1; a[1].k:=0; a[1].s[0]:=0;
 repeat
  for i:=1 to 4 do
   begin
    x1:=a[head].x+xx[i]; y1:=a[head].y+yy[i];
    k1:=a[head].k+1; tmps:=a[head].s;
    if (x1>=1)and(x1<=n)and(y1>=1)and(y1<=n) then
     if (map[x1,y1]<>-1)and(map[x1,y1]<>-2) then
      begin
       if (map[x1,y1]>m) and rp(a[head].s,map[x1,y1]) or(map[x1,y1]<=m) then
         if check(x1,y1,tmps) then
          begin
           if (map[x1,y1]<=m)and(map[x1,y1]>0) then ins(map[x1,y1]+m);
           if (x1=n)and(y1=n) then
            begin
             write(k1);
             close(input); close(output);
             halt;
            end;
           inc(tail);
           with a[tail] do
            begin
             x:=x1; y:=y1; s:=tmps;
             k:=k1;
            end;
          end;
      end;
   end;
  inc(head);
 until head>tail;
 close(input);
 close(output);
end.