以附之名

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
~~~~~~~~~~~~~~~~~~~~~~~~~~~【让以附之名的时光机器带您回到曾经,属于现在的曾经】~~~~~~~~~~~~~~~~~~~~~~~~~~~
12
返回列表 发新帖
楼主: justin

开班第一贴

[复制链接]
发表于 2006-9-3 08:05:32 | 显示全部楼层
食堂被包围在了09的海洋里~~~
发表于 2006-9-8 03:34:53 | 显示全部楼层

jysc..

你的签名不够爽阿。。。勒令重写。。给你一个。。

program adv1900(input,output);
  const max=200;
        towardx:array[1..4]of integer=(-1,1,0,0);
        towardy:array[1..4]of integer=(0,0,-1,1);
  type timetype=record
                  st,ed,ls,tw:longint;
                end;
       qtype=record
               dj,wh:longint;
             end;
  var map:array[1..max,1..max]of boolean;
      list:array[1..max]of timetype;
      res:array[0..max,1..max,1..max]of longint;
      m,n,x,y,kt:longint;
  procedure readdata;
    var i,j:longint;
        ch:char;
    begin
      assign(input,'adv1900.in');reset(input);
      assign(output,'adv1900.out');rewrite(output);
      readln(n,m,x,y,kt);
      for i:=1 to n do
        begin
          for j:=1 to m do
            begin
              read(ch);
              if ch='.' then map[i,j]:=true else map[i,j]:=false;
            end;
          readln;
        end;
      for i:=1 to kt do
        begin
          readln(list.st,list.ed,list.tw);
          list.ls:=list.ed-list.st+1;
        end;
    end;
  procedure work;
    var i,j,k,ti,tj,t:longint;
        q:array[1..max]of qtype;
        st,ed,tx,ty,fx,fy:longint;
    begin
      for k:=0 to max do
        for i:=1 to max do
          for j:=1 to max do
            res[k,i,j]:=-1000;
       res[0,x,y]:=0;
      for k:=1 to kt do
        begin
          tx:=towardx[list[k].tw];
          ty:=towardy[list[k].tw];
          if tx=0 then begin fx:=1; fy:=0; end
          else begin fy:=1; fx:=0; end;
          i:=0;j:=0;
          repeat
            inc(i,fx);inc(j,fy);
            st:=1;ed:=0;
            if ty=0 then
              begin
                ti:=i;tj:=j;
                if tx=-1 then ti:=n else ti:=1;
                st:=0;ed:=0;
                repeat
                  inc(ti,tx);
                  inc(st);
                  q[st].dj:=res[k-1,ti-tx,j]+ti-tx;
                  q[st].wh:=ti-tx;
                  t:=st;
                  repeat
                    dec(t);
                  until (q[t].dj>q[st].dj) or (t=0);
                  q[t+1]:=q[st];
                  st:=t+1;

                  if map[ti,j]=false then
                    begin
                      st:=0;ed:=0;
                      res[k,ti,j]:=-1000;
                    end
                  else
                    begin
                      t:=ed;
                      repeat
                        inc(t);
                      until q[t].wh-ti<=list[k].ls;
                      ed:=t-1;
                      res[k,ti,j]:=res[k-1,q[ed+1].wh,j]+abs(ti-q[ed+1].wh);
                    end;
                until (ti=1) or (ti=n);
              end
            else
              begin
                ti:=i;tj:=j;
                if ty=-1 then tj:=n else tj:=1;
                st:=0;ed:=0;
                repeat
                  inc(tj,ty);
                  inc(st);
                  q[st].dj:=res[k-1,i,tj-ty]+tj-ty;
                  q[st].wh:=tj-ty;
                  t:=st;
                  repeat
                    dec(t);
                  until (q[t].dj>q[st].dj) or (t=0);
                  q[t+1]:=q[st];
                  st:=t+1;

                  if map[i,tj]=false then
                    begin
                      st:=0;ed:=0;
                      res[k,i,tj]:=-1000;
                    end
                  else
                    begin
                      t:=ed;
                      repeat
                        inc(t);
                      until q[t].wh-tj<=list[k].ls;
                      ed:=t-1;
                      res[k,i,tj]:=res[k-1,i,q[ed+1].wh]+abs(tj-q[ed+1].wh);
                    end;
                until (tj=1) or (tj=n);
              end;
          until (i>=n) or (j>=m);
        end;
    end;
  procedure print;
    var i,j,ti,tj:longint;
    begin
      ti:=1;tj:=1;
      for i:=1 to n do
        for j:=1 to n do
          if res[kt,i,j]>res[kt,ti,tj] then
            begin
              ti:=i;tj:=j;
            end;
      writeln(res[kt,ti,tj]+1);
      close(input);close(output);
    end;
  begin
    readdata;
    work;
    print;
  end.

发表于 2006-9-9 00:18:38 | 显示全部楼层
什么啊,极端点来个俄罗斯方块的-_-///....
发表于 2006-9-20 02:59:21 | 显示全部楼层
饿
发表于 2006-10-24 07:37:57 | 显示全部楼层
混乱啊````
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|EFZM ( 沪ICP备17029626号-4 )  

GMT+8, 2025-6-22 06:48 , Processed in 0.044539 second(s), 7 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表