【CCF 2020 6】1-线性分类器

题目分析:判断一条直线是否能将两组点集A和B隔开。

代码分析:建立坐标结构体,分别用两个数组存储点集A和B。两层for循环判断当前直线是否符合要求。先分别判断点集A和B中的点是否都在直线的一侧,再判断两个点集是否位于直线两侧。

满分C++代码:

 #include 
 using namespace std;
 const int N = 1e3 + 10;
 struct Point{
   int x;
   int y;
};
 Point a[N];
 Point b[N];
 int ans[25] = {0};
 int main()
{
   int n, m,i=0,j=0, ns=0;
   cin>>n>>m;
   for(int k=0; k<n; k++)
  {
     int x1,y1;
     char t;
     scanf("%d %d %c", &x1, &y1, &t);
     if(t == 'A')
     {
         a[i].x = x1;
         a[i].y = y1;
         i++;
     }
     else
     {
         b[j].x = x1;
         b[j].y = y1;
         j++;
     }
  }
  for(int k=0; k<m; k++)
   {
      int p0,px,py;
      scanf("%d %d %d", &p0, &px, &py);
      int flag1=1, flag2=1;
      int t1=0, t2=0;
      for(int t=0; t<i; t++)
     {
         if(!t) {
         t1 = p0 + a[t].x * px + a[t].y * py;
         if(t1 < 0) t1 = -1;
         else t1 = 1;
         continue; 
        } 
     int temp = p0 + a[t].x * px + a[t].y * py;
     if(temp * t1 < 0){
          flag1 = 0;
          break;
       }
    }
      if(!flag1) 
    {    
        ans[ns++] = 0;
        continue;
  }
      for(int t=0; t<j; t++)
    {
        if(!t) {
           t2 = p0 + b[t].x * px + b[t].y * py;
           if(t2 < 0) t2 = -1;
           else t2 = 1;
           continue; 
          }
       int temp = p0 + b[t].x * px + b[t].y * py;
       if(temp * t2 < 0){
          flag2 = 0;
          break;
        }
      }
      if(!flag2)
     {
        ans[ns++] = 0;
        continue;
     }
     if(t1 * t2 < 0)
    {
       ans[ns++] = 1;
       continue;
    }
     else
        ans[ns++] = 0;
  }
  for(int t=0; t<ns; t++)
    {
        if(ans[t]) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
 
 return 0;
}

你可能感兴趣的:(CCF,CSP认证)