jzxx1925【基础】走迷宫 标准队列练习 BFS

 

1925: 【基础】走迷宫

时间限制: 1 Sec  内存限制: 32 MB
提交: 234  解决: 110
[提交][状态][讨论版]

题目描述

迷宫由N*N个方格组成,每个方格均被组织者事先标上了“0”或“1”(左上角第一个方格和右下角最后一个方格一定是“0”)。当你进入左上角的第一个方格中时,看到相邻的方格是“0”时则可以进入,而如果是“1”时则表示此路不通。兔兔被告之:从迷宫的左上角第一个方格的入口处准备进入时,你可得到一个记有N*N分值的记分表,每经过一个标有“0”的方格,记分表将自动扣去1分,当走到右下角最后一个方格的出口处时,将显示你手中的记分表剩余的分值。夏令营的组织者将只奖励所有参加此项活动中,记分表剩余的分值最多的营员。

输入

第一行是一个整数N(3≤N≤40),接下来有N行,每行均有N个由0 和1组成的数据

输出

包括一个整数(记分表剩余的分值)

样例输入

4
0011
1000
0001
1000

样例输出

9
 
 
 
const
    dx:array[1..4] of longint=(1,0,-1,0);
    dy:array[1..4] of longint=(0,1,0,-1);
type
    Queue=record
        data:array[1..10000] of record
                                    x,y,w:longint;
                                end;
        head,tail:longint;
    end;
var
    Q:Queue;
    x,y,w,x0,y0,i,j,n:longint;
    a:array[1..100,1..100] of longint;
    c:char;
 
procedure Qinit;
begin
    Q.head:=1; Q.tail:=1;
end;
function Qempty:boolean;
begin
    exit(Q.head=Q.tail);
end;
procedure Qin(x,y,w:longint);
begin
    Q.data[Q.tail].x:=x; Q.data[Q.tail].y:=y; Q.data[Q.tail].w:=w;
    inc(Q.tail);
end;
procedure Qout(var x,y,w:longint);
begin
    x:=Q.data[Q.head].x; y:=Q.data[Q.head].y; w:=Q.data[Q.head].w;
    inc(Q.head);
end;
 
begin
    readln(n);
    for i:=1 to n do
    begin
        for j:=1 to n do
        begin
            read(c);
            if c='0' then a[i,j]:=0 else a[i,j]:=1;
        end;
        readln;
    end;
    Qinit;
    Qin(1,1,n*n-1);
    a[1,1]:=n*n-1;
    while(not Qempty) do
    begin
        Qout(x0,y0,w);
        for i:=1 to 4 do
        begin
            x:=x0+dx[i]; y:=y0+dy[i];
            if (x>=1)and(x<=n)and(y>=1)and(y<=n)and(a[x,y]=0) then
            begin
                Qin(x,y,w-1); a[x,y]:=w-1;
            end;
        end;
    end;
    writeln(a[n,n]);
end.
 

 队列状态图:(一定要看懂,对理解代码很重要)

代码特点:

1、数据定义用了record嵌套,以前看过别人这样写法,这是我第一次应用。

2、写了四个标准函数,使程序可读性增强:

    Qinit(队列初始化),Qempty(判断队列是否为空),Qin(入队),Qout(出队)。

 

转载于:https://www.cnblogs.com/qilinart/articles/4019378.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值