#include <stdio.h>
#define DOT_MAX 1000
#define LINE_MAX 20
struct Dot
{
int x;
int y;
char type;
}dot[DOT_MAX];
struct Line
{
int t0;
int t1;
int t2;
}line[LINE_MAX];
int is_perfect_depart(int dot_num, int t0, int t1, int t2, int state)
{
int i, j;
if(state == 1)
{
for(i = 0; i < dot_num; i++)
{
if((t0 + t1 * dot[i].x + t2 * dot[i].y) == 0) //点在线上
return 0;
else if(((t0 + t1 * dot[i].x + t2 * dot[i].y) > 0 && dot[i].type == 'B') || ((t0 + t1 * dot[i].x + t2 * dot[i].y) < 0 && dot[i].type == 'A'))
return 0;
}
return 1;
}
if(state == 0)
{
for(i = 0; i < dot_num; i++)
{
if((t0 + t1 * dot[i].x + t2 * dot[i].y) == 0) //点在线上
return 0;
else if(((t0 + t1 * dot[i].x + t2 * dot[i].y) > 0 && dot[i].type == 'A') || ((t0 + t1 * dot[i].x + t2 * dot[i].y) < 0 && dot[i].type == 'B'))
return 0;
}
return 1;
}
}
int main()
{
int i, j, state;
int dot_num, line_num;
scanf("%d %d", &dot_num, &line_num);
for(i = 0; i < dot_num; i++)
scanf("%d %d %c", &dot[i].x, &dot[i].y, &dot[i].type);
for(i = 0; i < line_num; i++)
scanf("%d %d %d", &line[i].t0, &line[i].t1, &line[i].t2);
for(i = 0; i < line_num; i++)
{
if(((line[i].t0 + line[i].t1 * dot[i].x + line[i].t2 * dot[i].y) > 0 && dot[i].type == 'A') || ((line[i].t0 + line[i].t1 * dot[i].x + line[i].t2 * dot[i].y) < 0 && dot[i].type == 'B'))
state = 1;
else
state = 0;
int result = is_perfect_depart(dot_num, line[i].t0, line[i].t1, line[i].t2, state);
if(result == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
以下代码思路与上相同,写得更简洁一些
#include <stdio.h>
struct Dot
{
int x;
int y;
char type;
} dot[1000];
struct Line
{
int t0;
int t1;
int t2;
} line[20];
int main()
{
int n, m, i, j, flag, t;
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++)
scanf("%d %d %c", &dot[i].x, &dot[i].y, &dot[i].type);
for(i = 0; i < m; i++)
scanf("%d %d %d", &line[i].t0, &line[i].t1, &line[i].t2);
for(i = 0; i < m; i++)
{
t = line[i].t0 + line[i].t1 * dot[0].x + line[i].t2 * dot[0].y;
if((t > 0 && dot[0].type == 'A') || (t < 0 && dot[0].type == 'B'))
flag = 1;
else
flag = 0;
for(j = 0; j < n; j++)
{
t = line[i].t0 + line[i].t1 * dot[j].x + line[i].t2 * dot[j].y;
if(flag)
{
if(!((t > 0 && dot[j].type == 'A') || (t < 0 && dot[j].type == 'B')))
{
printf("No\n");
break;
}
}
else
{
if(!((t > 0 && dot[j].type == 'B') || (t < 0 && dot[j].type == 'A')))
{
printf("No\n");
break;
}
}
}
if(j == n)
printf("Yes\n");
}
return 0;
}