单挑女飞贼

来源:互联网 发布:安全研究员与程序员 编辑:程序博客网 时间:2024/04/28 04:22

[描述]

在一个夜黑风高,伸手不见五指的深夜,睡梦中的林月如突然听到房外一阵躁动。她出去一看,发现一个女飞贼抢了一个古董商的包袱。

"站住!"
"
那你为什么不来追我?"
"
因为程序设计,在李大哥来之前,我不能追你。"
"
那李逍遥为什么不来呢?"
"
大概程序出bug了吧"
………………………………………………
终于,在登了一个又一个时辰后,林月如终于忍不住了,开始向女飞贼发起进攻。

"喂!你为什么可以动???"
"
这大概也是一个bug吧!"
"
不公平啊!"
"
废话少说。"

已知林月如和女飞贼站在一个矩阵中,矩阵中有某些障碍物不可穿越。月如使出的铜钱镖可攻击8个方向,但不可穿越障碍物(可视为不能穿墙的重狙)。每个单位时间,月如可向上下左右4个方向移动一格,攻击不浪费时间。当然,月如想尽快结束这场无聊的战斗,所以她想在最短的时间内消灭女飞贼。

格式

[输入格式]

第一行为2个数N,M表示矩阵的规模(N为高,M为宽)

接下来是N*M的矩阵,O表示空地,X表示障碍物。

下面是若干行数据,每行为一对数据,分别是女飞贼的位置和林月如的位置,显然她们都不可能在障碍物上。

"0 0 0 0"为输入结束标志。

[输出格式]

每一组数据输出一行,仅一个整数,表示能消灭掉女飞贼的最短时间。

显然若能直接打到女飞贼,则时间为0

若无法消灭,则输出"Impossible!"。(不含引号)

样例1

[样例输入]

3   4

OXXO

XXOO

XOOO

3 2 2 4

3 3 1 1

0 0 0 0

[样例输出]

1

Impossible!

限制

1s

[提示]

对于30%的数据,N*M<=100
对于50%的数据,N*M<=400
对于100%的数据,N*M<=20000
对于100%的数据,测试数据组数不超过20

program li;
const
      dx:array[1..4] of integer=(0,1,0,-1);
      dy:array[1..4] of integer=(1,0,-1,0);
var
 a,c:array[1..1000,1..1000]of char;
 n,m,i,j,x1,x2,y1,y2,top,head,x,y,k,xx,yy,f:integer;
 o:array[1..20000,1..3] of integer;
 can:boolean;
 procedure kuansou;
 begin
 o[1,1]:=x1; o[1,2]:=y1;  k:=0;  o[1,3]:=0;
    head:=1; top:=1;
   repeat
    for i:=1 to 4 do
     begin
      can:=true;
      xx:=o[head,1]; yy:=o[head,2];
      x:=xx+dx[i]; y:=yy+dy[i];
      if ((x<1) or (x>n)) or ((y<1) or (y>m))or(a[x,y]='X') then can:=false;
      if can then
        begin
          top:=top+1;
          o[top,1]:=x; o[top,2]:=y;  o[top,3]:=o[head,3]+1;
         if a[x,y]='z' then begin writeln(o[top,3]); exit; end;
          a[x,y]:='X';
       end;
    end;
    head:=head+1;
 until (head>top);
 end;
 begin     
ASSIGN(INPUT,'input.TXT');RESET(INPUT);
assign(output,'output.txt');
rewrite(output);
readln(n,m);
for i:=1 to n do
 begin
  for j:=1 to m do
   read(c[i,j]);
   readln;
   end;
 read(x2,y2,x1,y1);
while (x1<>0)and(x2<>0)and(y1<>0)and(y2<>0) do
begin
 for i:=1 to n do
  for j:=1 to m do
    a[i,j]:=c[i,j];
  for i:=x2-1 downto 1 do
   if a[i,y2]<>'X'then a[i,y2]:='z' else break;
  for i:=x2+1 to n do
   if a[i,y2]<>'X'then a[i,y2]:='z' else break;
  for j:=y2-1 downto 1 do
   if a[x2,j]<>'X'then a[x2,j]:='z' else break;
  for j:=y2+1 to m do
   if a[x2,j]<>'X'then a[x2,j]:='z' else break;
   i:=x2;j:=y2;
    repeat
      i:=i+1; j:=j+1;
      if (i>=1)and(i<=n)and(j>=1)and(j<=m)and(a[i,j]<>'X') then a[i,j]:='z' else break;
    until (i<1)or(i>n)and(j<1)and(j>m);
    i:=x2;j:=y2;
    repeat
      i:=i-1; j:=j-1;
      if (i>=1)and(i<=n)and(j>=1)and(j<=m)and(a[i,j]<>'X') then a[i,j]:='z' else break;
    until (i<1)or(i>n)and(j<1)and(j>m);
    i:=x2;j:=y2;
    repeat
      i:=i+1; j:=j-1;
      if (i>=1)and(i<=n)and(j>=1)and(j<=m)and(a[i,j]<>'X') then a[i,j]:='z' else break;
    until (i<1)or(i>n)and(j<1)and(j>m);
    i:=x2;j:=y2;
    repeat
      i:=i-1; j:=j+1;
      if (i>=1)and(i<=n)and(j>=1)and(j<=m)and(a[i,j]<>'X') then a[i,j]:='z' else break;
    until (i<1)or(i>n)and(j<1)and(j>m);
  if a[x1,y1]='z' then writeln('0') else
    begin
      kuansou;
      if head>top then writeln('Impossible!');
    end;
readln(x2,y2,x1,y1);
end;
close(input);
close(output);
end.

0 0
原创粉丝点击