zoukankan      html  css  js  c++  java
  • JZOJ 3.18 1508——【普及模拟】蚂蚁

    题目描述

    在二维平面坐标轴里面,有N只蚂蚁,第i只蚂蚁所在的点的坐标是(xi, yi),坐标都是整数。所有蚂蚁的移动速度都相等,都是每秒移动1个单位。每只蚂蚁都有一个固定的移动方向,是如下4种方向之一,都是平行于坐标轴的:

    l N表示向北(即朝上), 则y坐标正方向。

    l E表示向东(即朝右), 则x坐标正方向。

    l S表示向南(即向下), 则y坐标负方向。

    l W表示向西(即向左), 则x坐标负方向。

    当2只或多只蚂蚁在某个时刻碰(不一定是整数时刻)撞到一起,那么这些蚂蚁都会立即消失。例如蚂蚁A的初始位置是(0, 0)且方向是向东,蚂蚁B的初始位置是(1, 0)且方向是向西,那么0.5秒后,两只蚂蚁会在点(0.5, 0)处碰撞,两只蚂蚁瞬间都消失。当所有的碰撞结束后,还有多少只蚂蚁存在?不管蚂蚁最终移动到哪里,只要没有消失,都算是存在。

    输入

    第一行,一个整数N(1 ≤ N ≤ 50)。

    第二行,一个长度是N的字符串,第i个字符表示第i只蚂蚁的移动方向。

    接下来有N行,每行两个整数,表示蚂蚁的横坐标x和纵坐标y。

    -1000 ≤ x,y ≤ 1000。输入数据保证,一开始没有两只蚂蚁具有相同的位置。

    对于50%的数据, 蚂蚁的坐标范围【-100,100】。

    输出

    一个整数,表示当所有的碰撞结束后,存在的蚂蚁的数量。

    输入样例

    4

    NWNE

    0 0

    10 10

    20 20

    30 30

    4

    NEWS

    -10 0

    0 -10

    0 10

    10 0

    4

    EWSS

    0 0

    9 0

    0 4

    0 5

    9

    EENWWSWSE

    -1 0

    1 0

    0 0

    -1 -1

    1 -1

    0 1

    0 -1

    -1 1

    1 1

    5

    SWNSE

    -2 -1

    -3 -1

    -2 -3

    1 3

    -3 -2

    9

    ESEWNNEWW

    -1 -1

    -1 0

    -1 1

    0 -1

    0 0

    0 1

    1 -1

    1 0

    1 1

    4

    EWEN

    2 2

    10 2

    0 2

    0 0

    3

    NEN

    2 0

    0 2

    1 1

    2

    SW

    -1000 1000

    1000 -1000

    输出样例

    2

    0

    2

    5

    2

    4

    2

    1

    0


    题解:

    纯模拟,枚举时间将坐标加或减0.5,再判断有没有蚂蚁碰撞。


    代码如下:

    var
      n,i,j,ans,k:longint;
      s:string;
      x,y:array[1..50] of real;
      f,bool:array[1..50] of boolean;
    
    begin
      assign(input,'ant.in');
      assign(output,'ant.out');
      reset(input);
      rewrite(output);
      readln(n);
      readln(s);
      fillchar(f,sizeof(f),false);
      for i:=1 to n do readln(x[i],y[i]);
      for i:=1 to 4000 do
        begin
          fillchar(bool,sizeof(bool),false);
          for j:=1 to n do
            case s[j] of
              'N':y[j]:=y[j]+0.5;
              'S':y[j]:=y[j]-0.5;
              'W':x[j]:=x[j]-0.5;
              'E':x[j]:=x[j]+0.5;
            end;
          for j:=1 to n-1 do
            if not(f[j]) then
              for k:=j+1 to n do
                if not(f[k]) then
                  if (x[j]=x[k]) and (y[j]=y[k]) then begin bool[j]:=true; bool[k]:=true; end;
          for j:=1 to n do
            if bool[j] and not(f[j]) then
              begin
                f[j]:=true;
                inc(ans);
              end;
        end;
      write(n-ans);
      close(input);
      close(output);
    end.
    
  • 相关阅读:
    前端vue使用js-xlsx导出excel的三种方法
    vue使用echarts绘制河南地图并实现个人轨迹
    VUE中使用Echarts绘制柱状图
    springboot项目配置拦截器
    springboot+mybatis的多数据源配置
    Java后端高频面试题汇总
    Java基础专题
    Java集合专题
    Java并发专题
    JVM专题javascript:;
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412364.html
Copyright © 2011-2022 走看看