jzoj 1577. 【普及模拟】抓猫 解题报告

本文介绍了一个模拟抓猫的算法问题,目标是最小化捕捉器数量来捕获所有按特定路径移动的城市流浪猫。输入包括网格大小及各点的移动方向,输出最少需要的捕捉器数目。
题目描述
流浪猫布满城市的每一个角落,非常影响市容市貌,作为城市聘请的抓猫者,你有一种捕捉器,一定可以捕捉到所有走到里面的猫,更加幸运的是你有一个非常厉害的动物心理学家,他可以预测猫在不同位置的行走方向(共有东、西、南、北四种情况)

为了节约经费,问你最少需要多少个捕捉器才能把所有的猫都抓住。
输入
输入第一行包含两个整数N和M(1<=N,M<=1000),表示城市被划分成N×M的网格。接下来N行,每行包含M个字符“E”、“W”、“S”、“N”代表东、西、南、北4个方向,表示当猫在该位置的行走方向,保证猫不会走出城市区域。
输出
输出一个整数表示最少需要的捕捉器数。
样例输入
3 4

SWWW

SEWN

EEEN

样例输出
2

数据范围限制
提示
【数据说明】

40% 1<=N,M<=4

100% 1<=N,M<=1000


代码如下:一段不是搜索胜似搜索的代码。。

var
 a:array[0..1000,0..1000]of char;
 b:array[0..1000,0..1000]of longint;
 f:array[0..1000,0..1000]of boolean;
 n,m,i,j,k,d,dd,ans:longint;
begin
 assign(input,'d.in');reset(input);
 assign(output,'d.out');rewrite(output);
 readln(n,m);
 for i:=1 to n do
 begin
  for j:=1 to m do
   read(a[i,j]);
   readln;
  end;
  fillchar(b,sizeof(b),$7);
 k:=1;
 for i:=1 to n do
  for j:=1 to m do
    if not f[i,j] then
     begin
       d:=i; dd:=j;
        while not f[d,dd] do
         begin
          f[d,dd]:=true;
          if a[d,dd]='W' then begin b[d,dd]:=k; dec(dd); continue; end;
          if a[d,dd]='E' then begin b[d,dd]:=k; inc(dd); continue; end;
          if a[d,dd]='S' then begin b[d,dd]:=k; inc(d); continue; end;
          if a[d,dd]='N' then begin b[d,dd]:=k; dec(d); continue; end;
         end;
        if b[d,dd]>=k then inc(ans);
        inc(k);
     end;
  write(ans);
  close(input); close(output);
end.

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值