现在的位置: 首页 > 综合 > 正文

poj1054

2018年01月15日 ⁄ 综合 ⁄ 共 1317字 ⁄ 字号 评论关闭

【题意】

有一个r*c的方格,青蛙会以相同的向量v=(x,y)跳过,跳过的地方留下痕迹,青蛙在格子外哪里出发都有可能,问有最多有多少只青蛙。

【输入】

r c

n

以下n行每行描述一个点。

【输出】

最多有多少只青蛙。

比较暴力……

program poj1054;
type
  point=record
          x,y:longint;
        end;
var
  n,r,c,i,j,k,ans,x,y:longint;
  v:array [0..5001,0..5001] of boolean;
  p:array [0..5001] of point;
function max (a,b:longint):longint;
begin
  if a>b then exit(a)
         else exit(b);
end;
procedure swap (var a,b:point);
var
  i:point;
begin
  i:=a;
  a:=b;
  b:=i;
end;
procedure qsort (s,e:longint);
var
  i,j:longint;
  k:point;
begin
  if s>=e then exit;
  i:=s;
  j:=e;
  k:=p[(s+e) div 2];
  while i<=j do
    begin
      while (p[i].x<k.x)or((p[i].x=k.x)and(p[i].y<k.y)) do inc(i);
      while (p[j].x>k.x)or((p[j].x=k.x)and(p[j].y>k.y)) do dec(j);
      if i>j then break;
      swap(p[i],p[j]);
      inc(i);
      dec(j);
    end;
  qsort(s,j);
  qsort(i,e);
end;
function dfs (x,y,xx,yy:longint):longint;
var
  k:longint;
begin
  k:=2;
  while (x+xx>0)and(x+xx<=r)and(y+yy>0)and(y+yy<=c) do
    if v[x+xx,y+yy] then
      begin
        inc(k);
        x:=x+xx;
        y:=y+yy;
      end
                    else
      exit(0);
  exit(k);
end;
begin
  read(r,c);
  read(n);
  fillchar(v,sizeof(v),false);
  for i:=1 to n do
    begin
      read(p[i].x,p[i].y);
      v[p[i].x,p[i].y]:=true;
    end;
  qsort(1,n);
  ans:=2;
  for i:=1 to n-1 do
    for j:=i+1 to n do
      begin
        x:=p[j].x-p[i].x;
        y:=p[j].y-p[i].y;
        if (p[i].x-x>0)and(p[i].y-y>0)and
        (p[i].x-x<=r)and(p[i].y-y<=c) then continue;
        if (p[i].x+(ans-1)*x>0)and(p[i].x+(ans-1)*x<=r)
        and(p[i].y+(ans-1)*y>0)and(p[i].y+(ans-1)*y<=c) then
          ans:=max(ans,dfs(p[j].x,p[j].y,x,y));
      end;
  if ans=2 then writeln(0)
           else writeln(ans);
end.


【上篇】
【下篇】

抱歉!评论已关闭.