# BZOJ[1033] [ZJOI2008] 杀蚂蚁antbuster

  1 #include <cmath>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <iostream>
6 #include <algorithm>
7 # define maxBat 30
8 # define maxT 200010
9 using namespace std;
10 int ot(){cout<<"******"<<endl;}
11 int O(){exit(0);}
12 int n,m;
13 int S,D,R,T,CNT;
14 struct Battery{
15     int x,y;
16 }bat[maxBat];
17 bool pd[10][10];
18 void init(){
19     scanf("%d%d",&n,&m);
20     scanf("%d%d%d",&S,&D,&R);
21     int x,y;
22     for(int i=1;i<=S;i++){
23         scanf("%d%d",&x,&y);
24         bat[i].x=x; bat[i].y=y;
25         pd[x][y]=1;
26     }
27     scanf("%d",&T);
28 }
29 double px[maxT];
30 int mov[5][3];
31 void beg(){
32     px[0]=1; int lim=(T-1)/6+1;
33     for(int i=1;i<=lim;i++) px[i]=px[i-1]*1.1;
34     mov[0][0]=0 ; mov[0][1]=1 ;
35     mov[1][0]=1 ; mov[1][1]=0 ;
36     mov[2][0]=0 ; mov[2][1]=-1 ;
37     mov[3][0]=-1 ; mov[3][1]=0 ;
38 }
39 int mes[10][10],now_tot,now_time;
40 bool Cake,Ed;
41 struct Ant{
42     int age,rank,Hp,x,y,cake,bg,id;
43     int lx,ly;
44     void A(){
45     printf("  id=%d  Hp=%d  pos= <%d,%d>  age= %d  rk= %d  ck= %d  bg= %d\n",id,Hp,x,y,age,rank,cake,bg);
46 }
47 }ant[15];
48 int tail;
49 void Birth(int tim){
50     if(pd[0][0]) return;
51     CNT++;
52     ant[tail].id=CNT;
53     ant[tail].rank=(CNT-1)/6+1;
54     ant[tail].bg=ant[tail].Hp=floor(4.0*px[ ant[tail].rank ]);
55     ant[tail].x=0; ant[tail].y=0;
56     ant[tail].lx=0; ant[tail].ly=0;
57     ant[tail].age=1; ant[tail].cake=0;
58     tail++; now_tot++;
59     pd[0][0]=1;
60 }
61 void Make_mes(){
62     for(int k=0;k<tail;k++){
63         if(ant[k].cake) mes[ant[k].x][ant[k].y]+=5;
64         else mes[ant[k].x][ant[k].y]+=2;
65     }
66 }
67 bool In(int x,int y){
68     if(x>=0 && x<=n && y>=0 && y<=m) return 1;
69     return 0;
70 }
71 int Mx_mes(int x,int y,int id){
72     int x_,y_; int mx=-1,ret=-1;
73     for(int i=0;i<4;i++){
74         x_=x+mov[i][0]; y_=y+mov[i][1];
75         if(!In(x_,y_)) continue;
76         if(x_==ant[id].lx && y_==ant[id].ly) continue;
77         if(pd[x_][y_]) continue;
78         if(mes[x_][y_] > mx) mx=mes[x_][y_],ret=i;
79     }
80     return ret;
81 }
82 int Spi(int x,int y,int now,int id){
83     now=((now-1)+4)%4;
84     int x_,y_; x_=x+mov[now][0]; y_=y+mov[now][1];
85     while(!In(x_,y_) || pd[x_][y_] || (ant[id].lx==x_ && ant[id].ly==y_)){
86         now=((now-1)+4)%4;
87         x_=x+mov[now][0]; y_=y+mov[now][1];
88     }
89     return now;
90 }
91 void Mov(){
92     // cout<<"Mov::"<<endl;
93     int to,x_,y_;
94     for(int k=0;k<tail;k++){
95         to=Mx_mes(ant[k].x,ant[k].y,k);
96         if(to==-1){
97             ant[k].lx=ant[k].x; ant[k].ly=ant[k].y;
98             if(ant[k].x==n && ant[k].y==m && !Cake){
99                 ant[k].Hp+=ant[k].bg/2;
100                 if(ant[k].Hp>ant[k].bg) ant[k].Hp=ant[k].bg;
101                 Cake=1; ant[k].cake=1;
102             }
103             continue;
104         }
105         if(ant[k].age%5==0) to=Spi(ant[k].x,ant[k].y,to,k);
106         x_=ant[k].x+mov[to][0]; y_=ant[k].y+mov[to][1];
107         pd[ant[k].x][ant[k].y]=0;
108         ant[k].lx=ant[k].x; ant[k].ly=ant[k].y;
109         // printf("  %d:: (%d,%d)-->(%d,%d)\n",ant[k].id,ant[k].x,ant[k].y,x_,y_);
110         ant[k].x=x_; ant[k].y=y_;
111         pd[ant[k].x][ant[k].y]=1;
112         if(x_==n && y_==m && !Cake){
113             ant[k].Hp+=ant[k].bg/2;
114             if(ant[k].Hp>ant[k].bg) ant[k].Hp=ant[k].bg;
115             Cake=1; ant[k].cake=1;
116         }
117     }
118     // cout<<endl;
119 }
120 double Dis(int k,int i){
121     double dis=sqrt((ant[k].x-bat[i].x)*(ant[k].x-bat[i].x) + (ant[k].y-bat[i].y)*(ant[k].y-bat[i].y));
122     return dis;
123 }
124 int Find_a(int i){
125     int aim=-1; double dis,mn=1000000.0;
126     for(int k=0;k<tail;k++){
127         dis=Dis(k,i);
128         if(dis>(double)R){continue;}
129         if(ant[k].cake) return k;
130         if(mn>dis) mn=dis,aim=k;
131     }
132     return aim;
133 }
134 struct LINE{
135     double k,b;
136     int x,y,x_,y_;
137 };
138 LINE Get_line(double x,double y,double x_,double y_){
139     LINE ret;
140     ret.k=(y-y_)/(x-x_); ret.b=y-ret.k*x;
141     ret.x=min(x,x_); ret.x_=max(x,x_);
142     ret.y=min(y,y_); ret.y_=max(y,y_);
143     return ret;
144 }
145 void Del(int t){
146     if(ant[t].cake) Cake=0;
147     pd[ant[t].x][ant[t].y]=0;
148     now_tot--; tail--;
149     for(int k=t;k<tail;k++){
150         ant[k]=ant[k+1];
151     }
152 }
153 double Dis2(int k,LINE line){
154     int x=ant[k].x,y=ant[k].y;
155     if(x<line.x || x>line.x_ || y<line.y || y>line.y_) return 10.5;
156     double dis=fabs( (double)y-line.k*x-line.b )/sqrt( line.k*line.k+1.0);
157     return dis;
158 }
159 void Kill(int aim,int i){
160     if(ant[aim].x==bat[i].x && ant[aim].y==bat[i].y){
161         ant[aim].Hp-=D;
162         return;
163     }
164     else if(ant[aim].x==bat[i].x){
165         int le=min(ant[aim].y,bat[i].y),ri=max(ant[aim].y,bat[i].y);
166         for(int k=0;k<tail;k++){
167             if(ant[k].x==ant[aim].x && ant[k].y>=le && ant[k].y<=ri){
168                 ant[k].Hp-=D;
169             }
170             if(k==tail) break;
171         }
172         return;
173     }
174     else if(ant[aim].y==bat[i].y){
175         int le=min(ant[aim].x,bat[i].x),ri=max(ant[aim].x,bat[i].x);
176         for(int k=0;k<tail;k++){
177             if(ant[k].y==ant[aim].y && ant[k].x>=le && ant[k].x<=ri){
178                 ant[k].Hp-=D;
179             }
180             if(k==tail) break;
181         }
182         return;
183     }
184     else{
185         LINE line=Get_line(ant[aim].x,ant[aim].y,bat[i].x,bat[i].y);
186         for(int k=0;k<tail;k++){
187
188             if(Dis2(k,line)<=0.5){
189                 // if(k!=aim) printf("  %d-->%d too\n",i,ant[k].id);
190                 ant[k].Hp-=D;
191             }
192             if(k==tail) break;
193         }
194         return;
195     }
196 }
197 void Fire(){
198     // printf("Aim::\n");
199     for(int i=1;i<=S;i++){
200         int aim=Find_a(i);
201         // printf("  %d-->%d\n",i,ant[aim].id);
202         if(aim==-1) continue;
203         Kill(aim,i);
204     }
205     // cout<<endl;
207     for(int k=0;k<tail;k++){
208         if(ant[k].Hp<0){
209             // printf(" %d ",ant[k].id);
210             Del(k); k--;
211         }
212         if(k==tail) break;
213     }
214     // cout<<endl<<endl;
215 }
216 bool End(){
217     for(int k=0;k<tail;k++){
218         if(ant[k].x==0 && ant[k].y==0 && ant[k].cake){
219             Ed=1; return 1;
220         }
221     }
222     return 0;
223 }
224 void Update(){
225     for(int i=0;i<=n;i++){
226         for(int j=0;j<=m;j++){
227             mes[i][j]--;
228             if(mes[i][j]<0) mes[i][j]=0;
229         }
230     }
231     for(int k=0;k<tail;k++){
232         ant[k].age++;
233     }
234 }
235 void Print(){
236     if(Ed) printf("Game over after %d seconds\n",now_time);
237     else printf("The game is going on\n");
238     printf("%d\n",now_tot);
239     for(int k=0;k<tail;k++){
240         printf("%d %d %d %d %d\n",ant[k].age-1,ant[k].rank,ant[k].Hp,ant[k].x,ant[k].y);
241     }
242 }
243 void oott(){
244     printf("Ant:: \n");
245     for(int k=0;k<tail;k++) ant[k].A();
246     cout<<endl;
247 }
248 void work(){
249     for(int hh=1;hh<=T;hh++){
250         now_time++;
251         if(now_tot<6) Birth(hh);
252         // cout<<"--------------------------NEW--------------------------"<<endl;
253         // cout<<"now_time= "<<now_time<<"  tot=="<<now_tot<<endl;
254         // oott();
255         Make_mes();
256         Mov();
257         Fire();
258         if(End()) break;
259         Update();
260         // oott();
261     }
262     Print();
263 }
264 int main(){
265     // freopen("antbuster_ex.in","r",stdin);
266     // freopen("antbuster_ex.out","w",stdout);
267     // freopen("antbuster_ex.out","w",stdout);
268     init();
269     beg();
270     // cout<<px[100]<<endl;
271     work();
272 }
antbuster

http://paste.ubuntu.org.cn/4280882

posted @ 2017-10-11 17:36  Nawox  阅读(267)  评论(0编辑  收藏  举报