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. |