【测试】图论专题训练--紧急援救

题目:紧急援救(bfs.pas/cpp/in/out)

题目描述

话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到Mike博士最短距离。
数据范围: n<=1000

输入格式

第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。

输出格式

一个数字k,表示从研究所出发找到Milk博士的最短距离。

样例输入

10

0100110100

0001110010

1000000001

1000100011

0000101100

1000001100

1001010011

0000010100

0101010000

1001000001

1 7

10 2

样例输出

14

 

宽搜题目没什么难度,注意读的时候按字符读,然后一次判断,一定记得换行!(也可以一次读一行,然后把一行扫描一次)

Pascal Code

program bfs;

const
  maxn=1000+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,step:longint;
  end;
  
var
  n:longint;
  map:array[0..maxn,0..maxn] of longint;
  h:array[0..maxn,0..maxn] of boolean;
  q:array[0..maxn] of tnode;
  first,target:tnode;
  l,r:longint;

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

procedure readdata;
var
  i,j:longint;
  s:ansistring;
begin
  readln(n);
  for i:=1 to n do
  begin
    read(s);
    for j:=1 to length(s) do
    begin
      map[i,j]:=ord(s[j])-ord('0');
      if map[i,j]=1 then map[i,j]:=-1;
    end;
    readln;
  end;
  {for i:=1 to n do
  begin
    for j:=1 to n do
      write(map[i,j]);
    writeln;
  end;}
  read(first.x,first.y);
  read(target.x,target.y);
end;

procedure inq(var x:tnode);
begin
  inc(r);r:=r mod maxn;
  inc(x.step);
  q[r]:=x;
  h[x.x,x.y]:=true;
  //writeln('X:',x.x,'  Y:',x.y,'  STEP:',x.step);
  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 maxn;
  //h[q[l].x,q[l].y]:=false;
  exit(q[l]);
end;

function kuo(var node,newnode:tnode;i:longint):boolean;
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>n)or(map[x,y]=-1) then
    begin
      exit(false);
    end;
    exit(true);
  end;
end;

procedure main;
var
  node,newnode:tnode;
  i:longint;
begin
  l:=0;r:=0;
  first.step:=-1;//入队后加1为0
  inq(first);
  while l<>r do
  begin
    node:=outq;
    for i:=1 to 4 do //四种方案扩展
    begin
      if kuo(node,newnode,i) then//可以扩展
      begin
        if not h[newnode.x,newnode.y] then
          inq(newnode);
      end;
    end;
  end;
end;

begin
  init;
  readdata;
  main;
  outit;
end.

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/08/19/2646684.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值