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(出队)。