1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 using namespace std;
7 int n,m,s,tur_d,r,T,born;
8 int in[11][11];
9 int xx[4]={0,1,0,-1},yy[4]={1,0,-1,0};
10 bool getcake,mp[11][11];
11 struct tur{int x,y;}tur[31];
12 struct ant{int lev,hp,age,x,y,lx,ly,mx;bool live,cake;}a[11];
13 struct point{int x,y;};
14 struct line{point a,b;}l;
15 point sub(point a,point b){point t;t.x=a.x-b.x;t.y=a.y-b.y;return t;}
16 int cmul(point a,point b){return a.x*b.y-a.y*b.x;}
17 int turn(point a,point b,point c){return cmul(sub(b,a),sub(c,a));}
18 int sqr(int x){return x*x;}
19 double caldis(int x1,int y1,int x2,int y2)
20 {return sqrt(sqr(x1-x2)+sqr(y1-y2));}
21 int cdis(int x,int y)
22 {return sqr(tur[x].x-a[y].x)+sqr(tur[x].y-a[y].y);}
23 double getdis(int x,int y)
24 {return sqrt(cdis(x,y));}
25 bool cmp(ant a,ant b){return a.age>b.age;}
26 void bornint(int k)
27 {
28 int l=born/6+1;
29 a[k].lev=l;
30 a[k].hp=a[k].mx=int(4*pow(1.1,l));
31 a[k].age=0;a[k].live=1;
32 a[k].x=a[k].y=a[k].lx=a[k].ly=0;
33 mp[0][0]=1;
34 born++;
35 }
36 bool jud(int x,int y,int lx,int ly)
37 {
38 if(mp[x][y]||x<0||y<0||x>n||y>m)return 0;
39 if(x==lx&&y==ly)return 0;
40 return 1;
41 }
42 void move(int k,int dir)
43 {
44 int x=a[k].x,y=a[k].y;
45 if(dir==-1){a[k].lx=x;a[k].ly=y;return;}
46 int nowx=x+xx[dir],nowy=y+yy[dir];
47 mp[x][y]=0;mp[nowx][nowy]=1;
48 a[k].lx=x;a[k].ly=y;a[k].x=nowx;a[k].y=nowy;
49 }
50 void spmove(int k,int dir)
51 {
52 int x=a[k].x,y=a[k].y,lx=a[k].lx,ly=a[k].ly;
53 for(int i=(dir-1+4)%4;;i=(i-1+4)%4)
54 {
55 int nowx=x+xx[i],nowy=y+yy[i];
56 if(jud(nowx,nowy,lx,ly))
57 {move(k,i);return;}
58 }
59 }
60 void premove(int k)
61 {
62 int x=a[k].x,y=a[k].y,lx=a[k].lx,ly=a[k].ly;
63 int mx=-0x7fffffff,dir=-1;
64 for(int i=0;i<4;i++)
65 {
66 int nowx=x+xx[i],nowy=y+yy[i];
67 if(jud(nowx,nowy,lx,ly)&&mx<in[nowx][nowy])
68 mx=in[nowx][nowy];
69 }
70 for(int i=0;i<4;i++)
71 {
72 int nowx=x+xx[i],nowy=y+yy[i];
73 if(jud(nowx,nowy,lx,ly)&&(mx==in[nowx][nowy])){dir=i;break;}
74 }
75 if((a[k].age+1)%5!=0||dir==-1)move(k,dir);
76 else spmove(k,dir);
77 }
78 bool cross(int x,int y)
79 {
80 double d=caldis(l.a.x,l.a.y,l.b.x,l.b.y);
81 if(x==l.a.x&&y==l.a.y||x==l.b.x&&y==l.b.y)return 1;
82 int x1=min(l.a.x,l.b.x),x2=max(l.a.x,l.b.x);
83 int y1=min(l.a.y,l.b.y),y2=max(l.a.y,l.b.y);
84 if(x<x1||x>x2|y<y1||y>y2)return 0;
85 point p;p.x=x;p.y=y;
86 if(fabs(turn(l.a,l.b,p))/d<=0.5)return 1;
87 return 0;
88 }
89 void attack(int k)
90 {
91 int tmp=-1,dis=0x7fffffff;
92 for(int i=1;i<=6;i++)if(a[i].live)
93 {
94 int d=cdis(k,i);
95 if(d<=r*r)
96 {
97 if(a[i].cake)tmp=i;
98 else if(!a[tmp].cake&&d<dis)
99 {dis=d;tmp=i;}
100 }
101 }
102 if(tmp==-1)return;
103 l.a.x=tur[k].x;l.a.y=tur[k].y;
104 l.b.x=a[tmp].x;l.b.y=a[tmp].y;
105 for(int i=1;i<=6;i++)
106 if(a[i].live)
107 {
108 if(cross(a[i].x,a[i].y))
109 a[i].hp-=tur_d;
110 }
111 }
112 bool solve(int t)
113 {
114 if(!mp[0][0])
115 for(int i=1;i<=6;i++)
116 if(!a[i].live)
117 {bornint(i);break;}
118 sort(a+1,a+7,cmp);
119 for(int i=1;i<=6;i++)if(a[i].live)
120 {
121 int x=a[i].x,y=a[i].y;
122 if(a[i].cake)in[x][y]+=5;
123 else in[x][y]+=2;
124 }
125 for(int i=1;i<=6;i++)if(a[i].live)
126 premove(i);
127 if(!getcake)
128 for(int i=1;i<=6;i++)if(a[i].live)
129 if(a[i].x==n&&a[i].y==m)
130 {
131 a[i].cake=1;
132 getcake=1;
133 a[i].hp=min(a[i].mx,a[i].hp+a[i].mx/2);
134 }
135 for(int i=1;i<=s;i++)attack(i);
136 for(int i=1;i<=6;i++)if(a[i].live)
137 if(a[i].hp<0)
138 {
139 mp[a[i].x][a[i].y]=0;
140 a[i].live=0;
141 if(a[i].cake)a[i].cake=getcake=0;
142 }
143 if(getcake)
144 for(int i=1;i<=6;i++)if(a[i].live)
145 if(a[i].x==0&&a[i].y==0&&a[i].cake)return 1;
146 for(int i=0;i<=n;i++)
147 for(int j=0;j<=m;j++)
148 if(in[i][j]>0)in[i][j]--;
149 for(int i=1;i<=6;i++)if(a[i].live)
150 a[i].age++;
151 return 0;
152 }
153 void ini()
154 {
155 freopen("1033.in","r",stdin);
156 freopen("1033.out","w",stdout);
157 scanf("%d%d",&n,&m);
158 scanf("%d%d%d",&s,&tur_d,&r);
159 for(int i=1;i<=s;i++)
160 {
161 scanf("%d%d",&tur[i].x,&tur[i].y);
162 mp[tur[i].x][tur[i].y]=1;
163 }
164 scanf("%d",&T);
165 }
166 void print()
167 {
168 int cot=0;
169 sort(a+1,a+7,cmp);
170 for(int i=1;i<=6;i++)if(a[i].live)cot++;
171 printf("%d\n",cot);
172 for(int i=1;i<=6;i++)
173 if(a[i].live)
174 printf("%d %d %d %d %d\n",a[i].age,a[i].lev,a[i].hp,a[i].x,a[i].y);
175 }
176 int main()
177 {
178 ini();
179 for(int i=1;i<=T;i++)
180 if(solve(i))
181 {
182 printf("Game over after %d seconds\n",i);
183 print();
184 return 0;
185 }
186 printf("The game is going on\n");
187 print();
188 return 0;
189 }