zoukankan      html  css  js  c++  java
  • 2017年10月07日普及组 蚂蚁

    这里写图片描述
    这里写图片描述

    分析
    a[i]表示第i只蚂蚁是否相碰。
    1.因为横纵坐标为-1000~1000,就枚举步数2000次就好了,因为他可能在某个带小数的坐标相碰,所以每一步走0.5而不能走1,这样的话步数就是4000次0.5而不是2000次1.
    2.每一次把相碰的蚂蚁全部找出来,并且标记,在找的过程中用另外的数组b标记,因为正在找的过程是参照上一次经过排除后的蚂蚁来找的,这一次标记不能用上去。
    3.做完以后把b数组更新后的值赋给a。

    程序:

    var
    a,b:array[0..51]of boolean;
    x,y:array[0..51]of real;
    t:array[0..51,1..2]of real;
    i,j,k,n,ans:longint;
    s:string;
    begin
        assign(input,'ant.in');
        reset(input);
        assign(output,'ant.out');
        rewrite(output);
        readln(n);
        readln(s);
        for i:=1 to n do
        begin
            readln(x[i],y[i]);
            a[i]:=true;
            b[i]:=true;
            if s[i]='N' then t[i,2]:=0.5 else
            if s[i]='E' then t[i,1]:=0.5 else
            if s[i]='S' then t[i,2]:=-0.5 else
            if s[i]='W' then t[i,1]:=-0.5;
        end;
        for i:=1 to 4000 do
        begin
            for j:=1 to n do
            if a[j]=true then
            begin
                x[j]:=x[j]+t[j,1];
                y[j]:=y[j]+t[j,2];
            end;
            for j:=1 to n do
            if a[j]=true then
            begin
                for k:=1 to n do
                if a[k]=true then
                if (j<>k) then
                if (x[k]=x[j]) and (y[k]=y[j])
                then
                begin
                    b[j]:=false;
                    b[k]:=false;
                    a[0]:=false;
                end;
            end;
            a:=b;
            if a[0]=true then break;
        end;
        for i:=1 to n do
        if a[i]=true then inc(ans);
        writeln(ans);
        close(input);
        close(output);
    end.
    
    
  • 相关阅读:
    590. N-ary Tree Postorder Traversal
    C++——指针3
    C++——指针2-指向数组的指针和指针数组
    C++——指针1
    C++——二维数组和对象数组
    C++——一维数组
    C++——程序的结构
    C++——类与对象
    C++——函数
    C++——简单程序设计
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500039.html
Copyright © 2011-2022 走看看