蚂蚁
题目大意:
有n只蚂蚁,他们各往一个方向走(上北,下南,左西和有东四个方向),他们如果撞到一起就会直接消失,每个单位时间走一格,但有一种情况:两只蚂蚁相距一格,两只蚂蚁相向而行,就会在0.5秒后相撞消失,求最后有多少只蚂蚁活着
数据范围限制
1 ≤ N ≤ 50
-1000 ≤ x,y ≤ 1000
对于50%的数据, 蚂蚁的坐标范围【-100,100】
提示
解题思路:
这道题就是一道模拟题,一般会想到枚举每一个单位时间,但这里要0.5地加,因为有可能两个相向而行的蚂蚁距离为一,如果是每次加一就会直接传过去
然后判断他们有没有相撞时,因为有可能是多个蚂蚁相撞,所以我们要先枚举一次所有蚂蚁,然后再枚举一次所有蚂蚁,要判断是否不是同一只,位置是否相同,是否都活着,如果满足,就说明碰撞,先将第二次枚举到的蚂蚁清除,然后将结果+1,再记录下来,等第二次枚举结束后,再来判断第一次枚举到的蚂蚁有没有撞到其他蚂蚁,撞到了就清除,在结果+1,最后输出n-结果即可
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const double dx[5]={0,0.5,-0.5,0,0};
const double dy[5]={0,0,0,0.5,-0.5};
int n,p[55],ans;
bool pd;
double maxx,minn;
string str;
struct
{int to;double x,y;
}a[55];
int main()
{scanf("%d",&n);cin>>str;str=' '+str;for (int i=1;i<=n;++i){scanf("%lf %lf",&a[i].y,&a[i].x);maxx=max(maxx,max(a[i].x,a[i].y));minn=min(minn,min(a[i].x,a[i].y));if (str[i]=='N') a[i].to=1;if (str[i]=='S') a[i].to=2;if (str[i]=='E') a[i].to=3;if (str[i]=='W') a[i].to=4;}for (double t=minn;t<=maxx;t+=0.5){for (int i=1;i<=n;++i)if (!p[i])a[i].x+=dx[a[i].to],a[i].y+=dy[a[i].to];for (int i=1;i<=n;++i)if (!p[i]){pd=false;for (int j=1;j<=n;++j)if (!p[j]&&a[i].x==a[j].x&&a[i].y==a[j].y&&i!=j){pd=true;记录p[j]=1;ans++;}if (pd) p[i]=1,ans++;}}printf("%d",n-ans);return 0;
}