单挑女飞贼
来源:互联网 发布:安全研究员与程序员 编辑:程序博客网 时间: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.
- 单挑女飞贼
- vijos P1263 单挑女飞贼
- 单挑
- 三国演义单挑谱1
- 三国演义单挑谱2
- 三国演义单挑谱3
- 说说“单挑”之道士
- 女女
- 集成技术:.NET单挑J2EE
- 谈谈法师如何单挑战士
- 我就是海归,不服单挑(ZT)
- 兰博基尼Reventon单挑喷气式战斗机(图)
- bnu1059 星际争霸之单挑 C语言版
- 最适合单挑的前十名人物攻略
- [甄子丹经典]陈真-单挑虹口道场
- 女程序员
- 女程序员
- 女英文名
- 问题 H: 查找细胞
- spfa
- 2015年05月01日
- 迷宫
- 2015年05月24日
- 单挑女飞贼
- 你未必是人好,你只是没机会放荡
- 尾声-怪盗基德的逃离
- 2015年06月06日
- configure websocket forward in nginx
- 2015年06月06日
- 最后一题
- 最后一题
- 问题 C: 求最长上升序列