单挑女飞贼

原创 2015年07月10日 09:46:43

[描述]

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

"站住!"
"
那你为什么不来追我?"
"
因为程序设计,在李大哥来之前,我不能追你。"
"
那李逍遥为什么不来呢?"
"
大概程序出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.

版权声明:本文为博主原创文章,未经博主允许不得转载。

TIME单挑1000_完整版

  • 2011年04月14日 13:58
  • 988KB
  • 下载

单挑机草花机路单编辑生成器0.7.7

  • 2014年08月06日 23:34
  • 7.79MB
  • 下载

阿里OTS表格存储单挑与批量多行插入--javaSDK

阿里官网API结合自己业务

草花机单挑机路单编辑生成器 0.7.9版

友情提示:未注册版本有时间限制,而且路单生成难度为简单模式,正式注册版无任何限制。 1.点击"生成路单",机器会自动出单(默认"王"最大为4个,其它随机),可反复点击生成出满...
  • v999v
  • v999v
  • 2014年08月06日 23:13
  • 1117

微信单挑三大运营商,继短信垄断之后,电话革命战已打响

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 作为一个用户数近 10 亿的 App,微信随便一个举动都能获得诸多用户的关注,而从昨日最新发布的 iOS 版微信 6.6...

【HDU1107】【模拟】武林 三个门派来回走定制方向单挑架

#include #include #include #include #include #include #include #include #include #include #include #...

TIME单挑1000单词

  • 2017年06月29日 09:18
  • 2.02MB
  • 下载

Time单挑1000+Time时代经典用字.rar

  • 2009年03月03日 20:29
  • 400KB
  • 下载

Oracle EBS OM处理销售挑库卡在待定事务处理和保留中

Oracle EBS OM 销售订单挑库,搬运单分配以后就被卡在待定事务处理和保留中

网挑全部文档

  • 2017年05月20日 02:36
  • 5.92MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单挑女飞贼
举报原因:
原因补充:

(最多只允许输入30个字)