回 帖 发 新 帖 刷新版面

主题:[讨论]LUKA!!!50分!

三、LUKA
源程序名        LUKA.PAS
可执行文件名    LUKA.EXE
输入文件名      LUKA.IN
输出文件名      LUKA.OUT
时间限制        1秒

Luka无法在国家比赛开赛前10天就到达赛场,是为了去出题人的对话那里得到一些情报。幸运的事,他知道出题人每天都会在Cres镇上散步,散步过程中,他们就会悄悄的谈论试题。所以,他决定在路线上偷听。
有趣的是,Cres镇的街道建造得可以使用一个直角坐标系来描述。出题人从(0,0)点开始散步,在每一个十字路口,他们可以走四种方向:右(X坐标加一),上(Y坐标加一),左,下。Luka站在某个坐标点上,他可以听到一些信息当且仅当他的位置和出题人的位置一样,或者在出题人的周围8个点处。你的任务是写一个程序来找出题者走到第几步时,会被窃听到,输出这些步的编号。(0,0)的编号为0。

输入
输入文件的第一行是有2个整数,X和Y,用一个空格隔开,-10000<=X,Y<=10000,是Luka的位置。然后的一行是一个整数K,1<=K<=100,000。接着的一行有K个字符,表示了出题人的行走路线。这些字符可能是:I – 右, S – 上, Z – 左, J – 下。

输出
你必须输出Luka每一次窃听到题目时出题人所走过的步数。这些编号严格按照输入数据,每个一行。
如果Luka什么也没有听到,就输出一个“-1”

样例
LUKA.IN
-1 0
8
JJZZSSIS

LUKA.OUT
0
1
5
6
7
8

回复列表 (共1个回复)

沙发


program luka;
var f:array ['A'..'Z',1..2] of longint;
    x,y,i,j,a,n:longint;
    ch:char;
    ok:boolean;
procedure checkout;
begin
  if (abs(x-i)<=1) and (abs(y-j)<=1) then
  begin writeln(a); ok:=false; end;
end;
begin
  assign(input,'luka.in');reset(input);
  assign(output,'luka.out');rewrite(output);
  ok:=true;
  f['I',1]:=1;
  f['S',2]:=1;
  f['Z',1]:=-1;
  f['J',2]:=-1;
  read(x,y,n);
  i:=0;j:=0;
  checkout;
  for a:=1 to n do begin
    repeat
      read(ch);
    until ch in ['J','S','Z','I'];
    inc(i,f[ch,1]);
    inc(j,f[ch,2]);
    checkout;
  end;
  if ok then writeln(-1);
  close(input);close(output);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册