问题描述:
| 不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻 的四块瓷砖中的任何一个上,但它也必须是安全的才行。 | |
数据输入: | 第1行两个正整数W和H,分别表示小路的宽度W和长度H,W和H都不大于20。 | |
结果输出: | 输出一行,只包括一个数,即你从第1块砖开始所能安全走过的最多的砖块个数(包括第1块砖)。 | |
样例: | 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... | 59 |
核心思想: | Bfs |
type
act=record
x,y:longint;
end;
var
q:array[0..10000]of act;
a:array[0..30,0..30]of longint;
sx,sy,w,h:longint;
//========================================================
procedure init;
var
ch:char;
i,j:longint;
begin
fillchar(a,sizeof(a),0);
readln(w,h);
for i:=1 to h do
begin
for j:=1 to w do
begin
read(ch);
if ch='#' then a[i,j]:=-1 else a[i,j]:=1;
if ch='@' then
begin
sx:=i;sy:=j;
end;
end;
readln;
end;
end;
//================================================================
procedure bfs;
var
head,tail,i,ans:longint;
dx:array[1..4]of longint=(1,0,-1,0);
dy:array[1..4]of longint=(0,1,0,-1);
t:act;
begin
fillchar(q,sizeof(q),0);
head:=1;tail:=1;ans:=1;
a[sx,sy]:=0;
q[1].x:=sx;q[1].y:=sy;
while head<=tail do
begin
t:=q[head];
for i:=1 to 4 do
begin
if a[t.x+dx[i],t.y+dy[i]]=1 then
begin
inc(tail);
q[tail]:=t;
inc(q[tail].x,dx[i]);
inc(q[tail].y,dy[i]);
inc(ans);
a[t.x+dx[i],t.y+dy[i]]:=0;
end;
end;
inc(head);
end;
writeln(ans);
end;
//========================================================
begin
assign(input,'p1329.in');reset(input);
assign(output,'p1329.out');rewrite(output);
init;
bfs;
close(input);close(output);
end.
题目来源:NDK 1329