比赛 |
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.