#include using namespace std; long long BrIsteFigure,F,P,M,K,nebitno,brtacke,brtacke1,GlavnaTacka,GlavnaTacka1,pozicijay1,pozicijax1,PrvaTackax,PrvaTackay,RadjenjeTetrisa,UradiTetris; float sumx,visinaresenja,SledeceMesto,Povrsina1,pozicijax,pozicijay; struct slog{ int ID,RotacijaFigure,IDFigureTetrisa; float Xmin,Duzina,Ymin,Visina,PomerajX,Povrsina; float x[1000],y[1000],xmax,ymax,xmin,ymin,xmax1,ymax1,ybigest,PomerajY; int rotacija,TackeTetrisa[20][20]; }; slog Figure[505]; bool cmp(slog a, slog b){ return a.Visina > b.Visina; } bool cmpID(slog a, slog b){ return a.ID < b.ID; } bool cmpIDFigureTetrisa(slog a, slog b){ return a.IDFigureTetrisa < b.IDFigureTetrisa; } int main(){ freopen("packing.in","r",stdin); freopen("packing.out","w",stdout); cin>>F; for(int f=1; f<=F; f++) { cin>>P; for(int p=1; p<=P; p++) { cin>>Figure[f].x[p]>>Figure[f].y[p]; if(Figure[f].x[p]Figure[f].xmax or p==1)Figure[f].xmax=Figure[f].x[p]; if(Figure[f].y[p]Figure[f].ymax or p==1)Figure[f].ymax=Figure[f].y[p]; } if((abs(Figure[f].ymax-Figure[f].ymin)>abs(Figure[f].xmax-Figure[f].xmin))) { Figure[f].rotacija=90; for(int p=1; p<=P; p++) { swap(Figure[f].y[p],Figure[f].x[p]); Figure[f].x[p]=-Figure[f].x[p]; } } cin>>M; for(int m=1; m<=M; m++) { cin>>K; for(int k=1; k<=K; k++) { cin>>brtacke; Povrsina1=0; if(k==1)GlavnaTacka=brtacke; if(k==1 and m==1)GlavnaTacka1=brtacke; if(M==4 and K==4)//ako je jedna od tetris figura { if(k>=3)//racunanje povrsinu { Povrsina1+=(Figure[f].x[brtacke1])*(Figure[f].y[GlavnaTacka]); Povrsina1-=(Figure[f].x[GlavnaTacka])*(Figure[f].y[brtacke1]); Povrsina1-=(Figure[f].x[brtacke])*(Figure[f].y[GlavnaTacka]); Povrsina1+=(Figure[f].x[GlavnaTacka])*(Figure[f].y[brtacke]); Povrsina1+=(Figure[f].x[brtacke])*(Figure[f].y[brtacke1]); Povrsina1-=(Figure[f].x[brtacke1])*(Figure[f].y[brtacke]); } brtacke1=brtacke; Povrsina1/=2; Figure[f].Povrsina+=abs(Povrsina1); pozicijax += Figure[f].x[brtacke]; pozicijay += Figure[f].y[brtacke]; } } if(M==4 and K==4)//upisivanje tacaka u tetris matricu //ako je figura tetris { pozicijax/=4; pozicijay/=4; pozicijay1=5+round(pozicijay)-Figure[f].y[GlavnaTacka1]; pozicijax1=5+round(pozicijax)-Figure[f].x[GlavnaTacka1]; Figure[f].TackeTetrisa[pozicijay1][pozicijax1]++; if(PrvaTackax>pozicijax1 or m==1)PrvaTackax=pozicijax1; if(PrvaTackay>pozicijay1 or m==1)PrvaTackay=pozicijay1; } } if(Figure[f].Povrsina==4 and M==4) { UradiTetris++; RadjenjeTetrisa++; } for(int i=PrvaTackay; i<=15; i++) { for(int j=PrvaTackax; j<=15; j++) { Figure[f].TackeTetrisa[i-PrvaTackay][j-PrvaTackax]=Figure[f].TackeTetrisa[i][j]; Figure[f].TackeTetrisa[i][j]=0; } } if(UradiTetris==1)//odredjivanje tetris figure { if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[0][3]==1) { Figure[f].IDFigureTetrisa=1; } //**** if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[1][2]==1) { Figure[f].IDFigureTetrisa=4; } if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[1][0]==1 and Figure[f].TackeTetrisa[1][1]==1 and Figure[f].TackeTetrisa[1][2]==1) { Figure[f].IDFigureTetrisa=4; Figure[f].rotacija+=180; for(int p=1; p<=P; p++) { Figure[f].y[p]=-Figure[f].y[p]; Figure[f].x[p]=-Figure[f].x[p]; } } //* //*** if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[1][0]==1 and Figure[f].TackeTetrisa[1][1]==1) { Figure[f].IDFigureTetrisa=3; } //** //** if(Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[1][0]==1 and Figure[f].TackeTetrisa[1][1]==1 and Figure[f].TackeTetrisa[1][2]==1) { Figure[f].IDFigureTetrisa=2; Figure[f].rotacija+=180; for(int p=1; p<=P; p++) { Figure[f].y[p]=-Figure[f].y[p]; Figure[f].x[p]=-Figure[f].x[p]; } } if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[1][0]==1) { Figure[f].IDFigureTetrisa=2; } // * //*** if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[1][1]==1) { Figure[f].IDFigureTetrisa=5; } if(Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[1][0]==1 and Figure[f].TackeTetrisa[1][1]==1 and Figure[f].TackeTetrisa[1][2]==1) { Figure[f].IDFigureTetrisa=5; Figure[f].rotacija+=180; for(int p=1; p<=P; p++) { Figure[f].y[p]=-Figure[f].y[p]; Figure[f].x[p]=-Figure[f].x[p]; } } // * //*** if(Figure[f].TackeTetrisa[0][0]==1 and Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[1][1]==1 and Figure[f].TackeTetrisa[1][2]==1) { Figure[f].IDFigureTetrisa=6; } // ** //** if(Figure[f].TackeTetrisa[0][1]==1 and Figure[f].TackeTetrisa[0][2]==1 and Figure[f].TackeTetrisa[1][0]==1 and Figure[f].TackeTetrisa[1][1]==1) { Figure[f].IDFigureTetrisa=7; } //** // ** } UradiTetris=0; //cout<Figure[f].xmax or p==1)Figure[f].xmax=Figure[f].x[p]; if(Figure[f].y[p]Figure[f].ymax or p==1)Figure[f].ymax=Figure[f].y[p]; } Figure[f].ID=f; Figure[f].Xmin=Figure[f].xmin; Figure[f].Duzina=abs(Figure[f].xmax-Figure[f].xmin); Figure[f].Ymin=Figure[f].ymin; Figure[f].Visina=abs(Figure[f].ymax-Figure[f].ymin); Figure[f].RotacijaFigure=Figure[f].rotacija; } if(RadjenjeTetrisa