您的位置:首页 > 其它

广搜练习(一)

2016-02-06 16:07 253 查看
1、 迷宫问题(maze.pas/.in/.out

【问题描述】

0 1 1 1 0 1 1 1

1 0 1 0 1 0 1 0

0 1 0 0 1 1 1 1

0 1 1 1 0 0 1 1

1 0 0 1 1 0 0 0

0 1 1 0 0 1 1 0

如上所示的迷宫图,其中1表示不通,0表示通,处于迷宫中的每个位置都可以有 8个方向探索可行路径前进,假设入口设在最左上角,出口位置设在最右下角,编写一个程序,找出一条从入口到出口的最短路径。注意,由于搜索方案可能不唯一,我们假设搜索的顺序优先从所在点的右侧开始搜索,然后搜索右下方,然后是正下方,依次搜索到该点的右上方,这样可以确保输出方案和测试数据一致。

输入格式

第一行两个整数m和n,表示行和列(n<=10)

第二行开始,每行n个0或1共m行,0表示通,1表示不通。

输出格式

输出一条最短的路径

输入样例

6 8

0 1 1 1 0 1 1 1

1 0 1 0 1 0 1 0

0 1 0 0 1 1 1 1

0 1 1 1 0 0 1 1

1 0 0 1 1 0 0 0

0 1 1 0 0 1 1 0

输出样例

(1,1)-->(2,2)-->(3,3)-->(3,4)-->(4,5)-->(4,6)-->(5,7)-->(6,8)

const dx:array[1..4] of integer=(0,1,0,-1);
dy:array[1..4] of integer=(1,0,-1,0);
var
m,n,i,j,x1,y1,x2,y2,h,t,t2,ans,x,y:integer;
map:array[1..100,1..100] of integer;
xx,yy,pre:array[1..100] of integer;
begin
assign(input,'turn.in');
reset(input);
assign(output,'turn.out');
rewrite(output);
readln(n,m);
for i:=1 to n do begin
for j:=1 to m do
read(map[i,j]);
readln; end;
readln(x1,y1,x2,y2);
h:=0; t:=1; ans:=0; t2:=1;
xx[1]:=x1; yy[1]:=y1;
while h<t do
begin
inc(h);
for i:=1 to 4 do
begin
x:=xx[h]+dx[i];
y:=yy[h]+dy[i];
while (x<=n)and(y<=m)and(x>=1)and(y>=1)and((map[x,y]=0)or(map[x,y]=2)) do
begin
if map[x,y]=0 then
begin
inc(t);
xx[t]:=x; yy[t]:=y;
map[x,y]:=2;
pre[t]:=h;
if (x=x2)and(y=y2) then begin writeln(ans); halt; end;
end;
x:=x+dx[i]; y:=y+dy[i];
end;
end;
if h=t2 then begin inc(ans); t2:=t; end;
end;
end.


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