您的位置:首页 > 其它

【宽搜】校园迷宫

2012-11-06 18:34 120 查看

题目:校园迷宫 rqnoj195

题目描述

总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。注:只能往4个方向走:上、下、左、右。

输入格式

第1行,二个数,N,M。

接下来是一个N*M的矩阵,表示这个学校。(有N行,M列)。矩阵由2个数字组成。0:路;1:墙。路能走,墙不能走(这是基本常识。不过还是提醒一下,不然哪个牛又要飞檐走壁了)。

再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。

数据范围:0<M,N<=2000。0〈X1,X2〈=N,0〈Y1,Y2〈=M。

输出格式

一个数,表示最少要走的步数。如果走不到,则输出 No Answer!

样例输入

5 5
1 1 1 1 1
1 1 1 0 0
1 0 0 0 1
0 0 1 0 0
1 1 1 0 1
4 1
5 4

样例输出

6

 

这道题应该不用多说了吧。。。迷宫搜索的基础题目之一。。。由于数据较大  所以宽搜

Pascal Code

program rqnoj195;

const
maxq=2010*2010;
maxm=2000+10;
dx:array[1..4] of longint=(0,0,1,-1);
dy:array[1..4] of longint=(1,-1,0,0);

type
tnode=record
x,y:longint;
step:longint;
end;

var
n,m:longint;
map:array[0..maxm,0..maxm] of longint;
l,r:longint;
q:array[0..maxq] of tnode;
f:array[0..maxm,0..maxm] of boolean;
first,target:tnode;

procedure init;
begin
assign(input,'rqnoj195');
assign(output,'rqnoj195.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;

procedure readdata;
var
i,j:longint;
begin
read(n,m);
for i:=1 to n do
for j:=1 to m do
read(map[i,j]);
read(target.x,target.y);
read(first.x,first.y);
end;

procedure inq(var x:tnode);
begin
inc(r);r:=r mod maxq;
inc(x.step);
q[r]:=x;

f[x.x,x.y]:=true;

if (x.x=target.x)and(x.y=target.y) then
begin
writeln(x.step);
outit;
end;
end;

function outq:tnode;
begin
inc(l);l:=l mod maxq;
exit(q[l]);
end;

procedure kuo(var node,newnode:tnode;i:longint);
begin
newnode:=node;
with newnode do
begin
inc(x,dx[i]);
inc(y,dy[i]);
if (x<1)or(x>n)or(y<1)or(y>m) then
newnode:=node;
if map[x,y]=1 then
newnode:=node;
end;
end;

procedure main;
var
node,newnode:tnode;
i:longint;
begin
fillchar(f,sizeof(f),0);
first.step:=-1;//入队后加1为0
inq(first);
while l<>r do
begin
node:=outq;
for i:=1 to 4 do
begin
kuo(node,newnode,i);
if not f[newnode.x,newnode.y] then
inq(newnode);
end;
end;
writeln('No Answer!');
end;

begin
init;
readdata;
main;
outit;
end.


 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: