暴力跑就行,只不过在三角形内的话,需要用叉积去判
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define maxn 100005
#define eps 1e-6
bool grid[160][160];
void square()
{
int x, y, l;
scanf("%d%d%d", &x, &y, &l);
x += 50; y += 50;
for (int i = 0; i <= l; ++i)
{
for (int j = 0; j <= l; ++j)
grid[x + i][y + j] = true;
}
}
void circle()
{
int x, y, r;
scanf("%d%d%d", &x, &y, &r);
x += 50; y += 50;
for (int i = 0; i <= r; ++i)
{
grid[x][y + i] = true;
grid[x][y - i] = true;
}
int pos = r;
for (int i = 1; i <= r; ++i)
{
for (int j = pos; j >= 0; --j)
{
if (j*j + i*i <= r*r)
{
pos = j;
break;
}
}
for (int j = 0; j <= pos; ++j)
{
grid[x + i][y + j] = true;
grid[x + i][y - j] = true;
grid[x - i][y + j] = true;
grid[x - i][y - j] = true;
}
}
}
void triangle()
{
int x[3], y[3];
for (int i = 0; i < 3; ++i)
scanf("%d%d", &x[i], &y[i]);
for (int i = 0; i < 3; ++i)
{
x[i] += 50;
y[i] += 50;
}
int linex[3], liney[3];
linex[0] = x[1] - x[2]; liney[0] = y[1] - y[2];
linex[1] = x[2] - x[0]; liney[1] = y[2] - y[0];
linex[2] = x[0] - x[1]; liney[2] = y[0] - y[1];
int x1 = 200, y1 = 200, x2 = -1, y2 = -1;
for (int i = 0; i < 3; ++i)
{
if (x[i] < x1)
x1 = x[i];
if (x[i] > x2)
x2 = x[i];
if (y[i] < y1)
y1 = y[i];
if (y[i] > y2)
y2 = y[i];
}
for (int i = x1; i <= x2; ++i)
{
for (int j = y1; j <= y2; ++j)
{
if ((linex[0] * (j - y[2]) - (i - x[2])*liney[0])*(linex[0] * (y[0] - y[2]) - (x[0] - x[2])*liney[0]) >= 0)
if ((linex[1] * (j - y[0]) - (i - x[0])*liney[1])*(linex[1] * (y[1] - y[0]) - (x[1] - x[0])*liney[1]) >= 0)
if ((linex[2] * (j - y[1]) - (i - x[1])*liney[2])*(linex[2] * (y[2] - y[1]) - (x[2] - x[1])*liney[2]) >= 0)
grid[i][j] = true;
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--)
{
memset(grid, false, sizeof(bool) * 160 * 160);
int N;
scanf("%d", &N);
char cmd[4];
for (int i = 0; i < N; ++i)
{
scanf("%s", cmd);
if (cmd[0] == 'S')
{
square();
}
else if (cmd[0] == 'T')
{
triangle();
}
else
circle();
}
int sum = 0;
for (int i = 0; i < 160; ++i)
{
for (int j = 0; j < 160; ++j)
if (grid[i][j])
++sum;
}
printf("%d\n", sum);
}
//system("pause");
//while (1);
return 0;
}