【Usaco 2007 Dec silver】穿越泥地 (Standard IO)

本文介绍了一种使用BFS算法解决从起点到终点的最短路径问题的方法,特别适用于平面坐标系中存在障碍物的情况。通过遍历网格并记录已访问节点,确保了路径寻找的有效性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

FJ的屋子在平面坐标(0, 0)的位置,贝茜所在的牛棚则位于坐标(X,Y) (-500 <= X <= 500; -500 <= Y <= 500)处。当然咯,FJ也看到了地上的所有N(1 <= N <= 10,000)个泥塘,第i个泥塘的坐标为(A_i, B_i) (-500 <= A_i <= 500;-500 <= B_i <= 500)。每个泥塘都只占据了它所在的那个格子。不能走到池塘,而且只能平行x,y轴走。

思路:

bfs,加上记忆化

程序:

 type
        Point=record
                x,y,w:longint;
        end;
const
        maxn=500;
        dx:array [1..4] of longint=(1,-1,0,0);
        dy:array [1..4] of longint=(0,0,1,-1);
var
        a:array [-maxn-2..maxn+1,-maxn-2..maxn+2] of boolean;
        x,y,x1,y1,n,i,j:longint;
        state:array [1..1000000] of Point;

function cheak(x,y:longint):boolean;
begin
        if a[x,y] then exit(false);
        if (x<-500) or (x>500) or (y<-500) or (y>500) then exit(false);
        exit(true);

end;

procedure bfs;
var
        y1,x1,i,j,head,tail:longint;
begin
        head:=0; tail:=1;
        state[1].x:=0; state[1].y:=0;
        state[1].w:=0;
        repeat
                inc(head);
                for i:=1 to 4 do
                begin
                        x1:=state[head].x+dx[i];
                        y1:=state[head].y+dy[i];
                        if cheak(x1,y1) then
                        begin
                                inc(tail);
                                a[x1,y1]:=true;
                                state[tail].x:=x1;
                                state[tail].y:=y1;
                                state[tail].w:=state[head].w+1;
                        end;
                        if (x1=x) and (y1=y) then
                        begin
                                writeln(state[tail].w);
                                halt;
                        end;
                end;
        until head=tail;

end;

begin
        readln(x,y,n);
        for i:=1 to n do
        begin
                readln(x1,y1);
                a[x1,y1]:=true;
        end;

        bfs;
        writeln(-1);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值