線性分類器
阿新 • • 發佈:2020-09-23
依舊用的結構體。。。ps.好像是可以給一個輸入進行一次輸出的。
//2020-6-1 線性分類器 //給定一條直線,判斷它是否能將訓練資料中A,B兩類點分開 #include<iostream> using namespace std; struct Point//點 { int x,y;//二維座標 char type;//所屬類別 }; Point point[1001]; struct Line//線 { int a0,a1,a2;//a0+a1x+a2y=0 int flag;//1-可以完美分割 0-不可完美分割 }; Line line[21]; int main() { int n,m;//n個點,m條線 cin>>n>>m; for(int i=0;i<n;i++) { cin>>point[i].x>>point[i].y>>point[i].type; } for(int i=0;i<m;i++) { int lineLoc;//-1線下 1線上 cin>>line[i].a0>>line[i].a1>>line[i].a2; line[i].flag=1;//初始化 //由第一個點確定線上線下位置與所屬類別的關係 if(line[i].a0+line[i].a1*point[0].x+line[i].a2*point[0].y>0)lineLoc=1; else if(line[i].a0+line[i].a1*point[0].x+line[i].a2*point[0].y<0)lineLoc=-1; for(int j=1;j<n;j++) { if(lineLoc==1) {if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y>0) { if(point[j].type!=point[0].type) line[i].flag=0; } else if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y<0) { if(point[j].type==point[0].type) line[i].flag=0; } } else if(lineLoc==-1) { if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y<0) { if(point[j].type!=point[0].type) line[i].flag=0; } else if(line[i].a0+line[i].a1*point[j].x+line[i].a2*point[j].y>0) { if(point[j].type==point[0].type) line[i].flag=0; } } } if(line[i].flag==1)cout<<"Yes"<<endl; else if(line[i].flag==0)cout<<"No"<<endl; } return 0; }