SPOJ AMR11B
题意就是求给定正方形,圆,三角形的覆盖的整点个数,就是三角形的点判断不太懂
开始写着道题用的书上的叉积,用结构体还定义了构造函数,不知道是不是这个原因超时了..
于是换了个方法,虽然也是判断面积相等但是..不懂..记下来好了.
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int xx,nx,xy,ny; ///max min bool fra[300][300]; void legal(int &a) { a+=100; } bool ccir(int x,int y,int cx,int cy,int r) { int disp=(x-cx)*(x-cx)+(cy-y)*(cy-y); return disp<=r*r; } bool csqu(int x,int y) { return x>=nx&&x<=xx&&y>=ny&&y<=xy; } int sslo(int x0,int y0,int x1,int y1,int x2,int y2) { return abs(x0*(y1-y2)+x1*(y2-y0)+x2*(y0-y1)); } bool ctri(int x,int y,int tx[],int ty[]) { int sa=sslo(tx[0],ty[0],tx[1],ty[1],tx[2],ty[2]); int sb=sslo(x,y,tx[0],ty[0],tx[1],ty[1])+sslo(x,y,tx[0],ty[0],tx[2],ty[2])+sslo(x,y,tx[1],ty[1],tx[2],ty[2]); return sa==sb; } int main() { //freopen("b.in2","r",stdin); int T,n; char cmd[3]; scanf("%d",&T); while(T--) { int ans=0; scanf("%d",&n); memset(fra,0,sizeof(fra)); while(n--) { nx=ny=1e5; xx=xy=-1e5; scanf("%s",cmd); if(cmd[0]=='T') { int x[3],y[3]; for(int i=0;i<3;i++) { scanf("%d%d",&x[i],&y[i]); legal(x[i]); legal(y[i]); xx=max(x[i],xx); nx=min(x[i],nx); xy=max(y[i],xy); ny=min(y[i],ny); } for(int i=nx;i<=xx;i++) for(int j=ny;j<=xy;j++) if(ctri(i,j,x,y)) { ans+=!fra[i][j]; fra[i][j]=1; } } if(cmd[0]=='C') { int x,y,r; scanf("%d%d%d",&x,&y,&r); legal(x); legal(y); /* xx=max(x,xx); nx=min(x,nx); xy=max(y,xy); ny=min(y,ny); */ xx=x+r; nx=x-r; xy=y+r; ny=y-r; for(int i=nx;i<=xx;i++) for(int j=ny;j<=xy;j++) if(ccir(i,j,x,y,r)) { ans+=!fra[i][j]; fra[i][j]=1; } } if(cmd[0]=='S') { int x,y,r; scanf("%d%d%d",&x,&y,&r); legal(x); legal(y); xx=x+r; nx=x; xy=y+r; ny=y; int cnt=0; for(int i=nx;i<=xx;i++) for(int j=ny;j<=xy;j++) if(csqu(i,j)) { //printf("%d,%d:%d,%d\n",i,j,ans,fra[i][j]); ans+=!fra[i][j]; fra[i][j]=1; } } //printf("%d,%d\t%d,%d\n",nx,xx,ny,xy); } printf("%d\n",ans); } return 0; }