【模拟】蚂蚁(jzoj 1508)

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86692539

蚂蚁

题目大意:

有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;
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86692539