题意就是求给定正方形,圆,三角形的覆盖的整点个数,就是三角形的点判断不太懂
开始写着道题用的书上的叉积,用结构体还定义了构造函数,不知道是不是这个原因超时了..
于是换了个方法,虽然也是判断面积相等但是..不懂..记下来好了.
#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;
}