mdzzhhhhhhh…..
这题真恶心,猪国杀一轮只有一只猪在动,而这个一轮6只蚂蚁,最多20台炮。。。其实题目应该叫 “(被)蚂蚁杀”。
不得不提几个坑:
1.通过样例注意一下蚂蚁的年龄。
2.蚂蚁搬着蛋糕走到了洞口时,这一秒还没有结束,如果这一秒结束时炮把他打死了,那蛋糕也要归为。
3.计算斜率时斜率不存在。。。我貌似没学过几何QAQ
4.如何计算圆到线段距离:因为不能把蚂蚁射穿。但都是整点,所以用炮和目标蚂蚁的横纵坐标构造一个矩形,圆心在这个矩形内部的才可能被打到。
5.我开double过不去,得开float。。。
6.如果一个蚂蚁卡住不动一秒,那他下一秒可以往回走。
7.蛋糕传回去后,如果(n,m)上有一只蚂蚁,那他不会把蛋糕搬起来,只有在下一秒移动后有蚂蚁在那里才会搬起来。记得考虑有一个蚂蚁困在(n,m)了一秒,之后他把蛋糕搬起来了。。。。
8.蚂蚁洞上有蚂蚁时不会生蚂蚁。
也就这几个坑吧,,,也许是我脑洞太大,错了太多。
无注释的(下面有一个有注释的)
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define N 200005
#define fl float
using namespace std;
struct zb
{
int x,y;
friend bool operator ==(zb a,zb b){
if(a.x==b.x&&a.y==b.y)return 1;
return 0;
}
zb(){}
zb(int x_,int y_){
x=x_;y=y_;}
}bomb[25],Cake,Cave;
struct Ant{
int t,old,blood,lv;zb last,now;}ant[N];
int n,m,t,hurt,r,sum_b,nex[N],fro[N];//s->炮塔数量,d->伤害,r->攻击半径
int ant_sum,ant_now,boss;
int smell[10][10],map[10][10];//1->ant,2->bomb,3->cake
int turn[4][2]={
0,1,1,0,0,-1,-1,0};
fl level[100000];
int hahaha(int x)
{
int l=level[ant[x].lv];
ant[x].blood+=l/2;
if(ant[x].blood>l)ant[x].blood=l;
}
void delieve(int T)
{
if(map[0][0])return;
int l=++ant_now,v=(l-1)/6+1;
ant_sum++;map[0][0]=1;
ant[l].now=zb(0,0); ant[l].last=zb(-1,-1);
ant[l].t=T; ant[l].old=1;
ant[l].blood=level[v]; ant[l].lv=v;
}
bool check(zb x,zb last)
{
if(x.x<0||x.x>n||x.y<0||x.y>m)return 0;
if(map[x.x][x.y]!=0)return 0;
if(x==last)return 0;
return 1;
}
void mad_turn(int x,int To,zb zz)
{
for(int i=To-1;;i--)
{
if(i<0)i=3;
zb to=zb(ant[x].now.x+turn[i][0],ant[x].now.y+turn[i][1]);
if(check(to,zz)==1){ant[x].now=to;return;}
}
}
void move(int x)
{
int To=4,infor=-1;zb zz=ant[x].last;ant[x].last=ant[x].now;
for(int i=0;i<4;i++)
{
zb to=zb(ant[x].now.x+turn[i][0],ant[x].now.y+turn[i][1]);
if(!check(to,zz))continue;
if(smell[to.x][to.y]>infor)To=i,infor=smell[to.x][to.y];
}
if(To==4)
{
if(!boss&&Cake==ant[x].now){boss=x;hahaha(x);}
if(boss==x)Cake=ant[x].now;
map[ant[x].last.x][ant[x].last.y]=0;
map[ant[x].now.x][ant[x].now.y]=1;
return;
}
if(ant[x].old%5==0)mad_turn(x,To,zz);
else ant[x].now=zb(ant[x].now.x+turn[To][0],ant[x].now.y+turn[To][1]);
if(!boss&&Cake==ant[x].now){boss=x;h