江西万年县建设局网站,网络安全设计方案,建立网络平台,热血传奇网页游戏蚂蚁
题目大意#xff1a;
有n只蚂蚁#xff0c;他们各往一个方向走#xff08;上北#xff0c;下南#xff0c;左西和有东四个方向#xff09;#xff0c;他们如果撞到一起就会直接消失#xff0c;每个单位时间走一格#xff0c;但有一种情况#xff1a;两只蚂蚁相…蚂蚁
题目大意
有n只蚂蚁他们各往一个方向走上北下南左西和有东四个方向他们如果撞到一起就会直接消失每个单位时间走一格但有一种情况两只蚂蚁相距一格两只蚂蚁相向而行就会在0.5秒后相撞消失求最后有多少只蚂蚁活着
数据范围限制
1 ≤ N ≤ 50
-1000 ≤ x,y ≤ 1000
对于50%的数据 蚂蚁的坐标范围【-100100】
提示 解题思路
这道题就是一道模拟题一般会想到枚举每一个单位时间但这里要0.5地加因为有可能两个相向而行的蚂蚁距离为一如果是每次加一就会直接传过去
然后判断他们有没有相撞时因为有可能是多个蚂蚁相撞所以我们要先枚举一次所有蚂蚁然后再枚举一次所有蚂蚁要判断是否不是同一只位置是否相同是否都活着如果满足就说明碰撞先将第二次枚举到的蚂蚁清除然后将结果1再记录下来等第二次枚举结束后再来判断第一次枚举到的蚂蚁有没有撞到其他蚂蚁撞到了就清除在结果1最后输出n-结果即可
#includecstdio
#includeiostream
#includestring
#includecstring
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);cinstr;str str;for (int i1;in;i){scanf(%lf %lf,a[i].y,a[i].x);//输入maxxmax(maxx,max(a[i].x,a[i].y));//求最大minnmin(minn,min(a[i].x,a[i].y));//求最小if (str[i]N) a[i].to1;//四个方向if (str[i]S) a[i].to2;if (str[i]E) a[i].to3;if (str[i]W) a[i].to4;}for (double tminn;tmaxx;t0.5)//用最大和最小来枚举可以使最远的两个相撞完后结束因为有题意中的情况{for (int i1;in;i)if (!p[i])a[i].xdx[a[i].to],a[i].ydy[a[i].to];//移动for (int i1;in;i)if (!p[i])//判断是否还在{pdfalse;//预处理for (int j1;jn;j)//枚举其他点if (!p[j]a[i].xa[j].xa[i].ya[j].yi!j)//判断是否还在是否不同是否在同一个位置{pdtrue;记录p[j]1;//记录ans;//结果加一}if (pd) p[i]1,ans;//如果有和其他蚂蚁碰撞就记录结果加一}}printf(%d,n-ans);//输出剩下的return 0;
}