正题
大意
有n只蚂蚁,他们会往固定方向行走,行走速度相同,如果两只或多只相撞就会消除,求所有碰撞后剩余的蚂蚁数量
解题思路
将两只会相撞的蚂蚁碰撞的信息记录下来(包括需要多久后碰撞),然后将时间从小到大排序。
接下来要解决多只碰撞的问题,用两个数组表示以消除和已经有碰撞,然后如果发现这次的时间已经和上次的不一样了,就把已经碰撞的都标记为以消除。
代码
代码极丑无比
以下内容可能会引起你的不舒适,请选择性观看
include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
struct xjq/*啦啦啦啦啦*/{int fi,sn;double w;
}dis[2501];
int tot,n,ans;
double x[51],y[51],s;
char c[51];
bool tmp[51],e[51];
double abs(double x)
{if (x<0) return -x;else return x;
}
bool cmp(xjq x,xjq y)//排序用
{return x.w<y.w;
}
int main()
{scanf("%d",&n);scanf("\n");for (int i=1;i<=n;i++){cin>>c[i];}for (int i=1;i<=n;i++){scanf("%lf%lf",&x[i],&y[i]);}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (i==j) continue;if (x[i]==x[j] && y[i]==y[j]) //好像不会有这种情况,可以无视{dis[++tot].fi=i;dis[tot].sn=j;dis[tot].w=0;}else if (y[i]==y[j] && ((x[i]<x[j] && c[i]=='E' && c[j]=='W') || (x[i]>x[j] && c[i]=='W' && c[j]=='E')))//东西相撞{dis[++tot].fi=i;dis[tot].sn=j;dis[tot].w=abs(x[i]-x[j])/2;}else if (x[i]==x[j] &&((y[i]>y[j] && c[i]=='S' && c[j]=='N') || (y[i]<y[j] && c[i]=='N' && c[j]=='S')))//南北相撞{dis[++tot].fi=i;dis[tot].sn=j;dis[tot].w=abs(y[i]-y[j])/2;}else if (abs(x[i]-x[j])==abs(y[i]-y[j]))//直角相撞{if ((x[i]<x[j] && y[i]<y[j] && ((c[i]=='E' && c[j]=='S') || (c[i]=='N' && c[j]=='W')))||(x[i]>x[j] && y[i]>y[j] && ((c[i]=='W' && c[j]=='N') || (c[i]=='S' && c[j]=='E')))||(x[i]<x[j] && y[i]>y[j] && ((c[i]=='E' && c[j]=='N') || (c[i]=='S' && c[j]=='W')))||(x[i]>x[j] && y[i]<y[j] && ((c[i]=='W' && c[j]=='S') || (c[i]=='N' && c[j]=='E')))){dis[++tot].fi=i;dis[tot].sn=j;dis[tot].w=abs(y[i]-y[j]);}}}}ans=n;sort(dis+1,dis+tot+1,cmp);//排序for (int i=1;i<=tot;i++){if (dis[i].w>s){s=dis[i].w;for (int j=1;j<=n;j++)e[j]=tmp[j];//赋值}if (!e[dis[i].fi] && !e[dis[i].sn]){if (!tmp[dis[i].fi]) ans--;if (!tmp[dis[i].sn]) ans--;tmp[dis[i].fi]=true;tmp[dis[i].sn]=true;//printf("%d %d %lf\n",dis[i].fi,dis[i].sn,dis[i].w);}}printf("%d",ans);
}