自动求解角度图形题
输入:
线数n 给出的关系m(角度) 求解数量t n个 线上的交点数量a(有编号)要不要设为基准(n行里有一个即可0非1需要):要的话输入其绝对度数(》-181&《180)(跳到“:”外)接下来a个点编号(按线上的顺序依次,线段12(12是ab)上有4就是1 4 2) m个条件(1 2 5 4 70就是12右转70度与54射线方向一样) t个求解123就是角《123(<abc)代码:
#include<bits/stdc++.h>usingnamespacestd;#define_F_-1intdmuu;intn,m,t;structNode{intf,e;booloperator<(constNode&o)const{if(f!=o.f)returnf<o.f;returne<o.e;}booloperator==(constNode&o)const{returnf==o.f&&e==o.e;}};inlinelonglongkey(intf,inte){return((longlong)f<<32)|(unsigned)e;}inlineintfjf(longlongkk){return((longlong)kk>>32);}inlineintfje(longlongkk){return(int)(unsigned)(kk&0xFFFFFFFFLL);}unordered_map<longlong,longlong>ji;map<int,map<int,int>>tu;//实际unordered_map<longlong,unordered_map<longlong,int>>tutu;//冰冰冰(边图)longlongia(longlongnnn){if(!ji.count(nnn)){ji[nnn]=nnn;}if(ji[nnn]==nnn){returnnnn;}longlongrootf=ia(ji[nnn]);ji[nnn]=rootf;returnrootf;}intNbm(longlongpp){pp=ia(pp);inta=fjf(pp),b=fje(pp);if(tu.count(a)&&tu[a].count(b))returntu[a][b];return_F_;}intbm(inta,intb){returnNbm(key(a,b));}intmomo(intang){ang=ang%360;if(ang>180)ang-=360;if(ang<=-180)ang+=360;returnang;}//int qqvi(int c,int a,int b){// return 180-abs(abs(bm(a,b)-bm(a,c))-180);//}intqqvi(intc,inta,intb){intang1=bm(a,b);intang2=bm(a,c);if(ang1==_F_||ang2==_F_)return-9990;return180-abs(abs(ang1-ang2)-180);}voidpush_b(inta,intb,intc){longlongvi=key(a,b);vi=ia(vi);a=fjf(vi);b=fje(vi);tu[a][b]=c;tu[b][a]=(180-abs(c))*(c>=0?-1:1);}voidhe(longlonga,longlongb){a=ia(a);b=ia(b);if(a!=b){if(Nbm(a)!=_F_){ji[b]=a;}else{ji[a]=b;}}}queue<longlong>p;voidinf(){while(!p.empty()){longlongke=p.front();p.pop();ke=ia(ke);intvke=Nbm(ke);if(vke==_F_){continue;}for(autoit=tutu[ke].begin();it!=tutu[ke].end();++it){longlongi=it->first;intc=it->second;longlongri=ia(i);if(Nbm(ri)==_F_){push_b(fjf(ri),fje(ri),momo(vke+c));p.push(ri);}}}}intmain(){cin>>n>>m>>t;for(inti=1;i<=n;i++){inta,jj,pp=0;cin>>a>>jj;if(jj)cin>>pp;vector<int>b(a+1);for(intj=1;j<=a;j++)cin>>b[j];for(intj=1;j<=a;j++){for(intk=1;k<=a;k++){if(j!=k)ia(key(b[j],b[k]));}}for(intj=1;j<a;j++){longlonge1=ia(key(b[j],b[j+1]));if(j+2<=a){longlonge2=ia(key(b[j+1],b[j+2]));tutu[e1][e2]=0;tutu[e2][e1]=0;}}if(jj){for(intj=1;j<a;j++){push_b(b[j],b[j+1],pp);p.push(ia(key(b[j],b[j+1])));}}}// for (int i = 1; i <= n; i++) {// int a, jj, pp = 0;// cin >> a >> jj;// if (jj) cin >> pp;// vector<int> b(a + 1);// for (int j = 1; j <= a; j++) cin >> b[j];// for (int j = 1; j <= a; j++) {// for (int k = 1; k <= a; k++) {// if (j != k) ia(key(b[j], b[k]));// }// }// if (jj) {// push_b(b[1], b[2], pp);// p.push(ia(key(b[1], b[2])));// }//}for(inti=1;i<=m;i++){intnn,mm,aa,jj,pp;cin>>nn>>mm>>aa>>jj>>pp;longlonge1=ia(key(nn,mm));longlonge2=ia(key(aa,jj));tutu[e1][e2]=pp;tutu[e2][e1]=-pp;}inf();for(inti=1;i<=t;i++){intkk,ll,pp;cin>>kk>>ll>>pp;intans=qqvi(kk,ll,pp);cout<<ans<<endl;}return0;}/* 七年级八字模型题变形样例: 4 2 1 2 0 5 4 3 0 5 3 1 4 1 0 4 3 2 6 2 0 1 2 3 2 2 1 -110 3 1 1 2 110 1 2 3 4 5 1 2 0 5 4 3 0 5 3 1 4 1 0 4 3 2 6 2 0 1 2 4 3 1 6 0 4 3 2 6 0 1 6 1 2 70 3 2 2 1 -110 3 1 1 2 110 1 2 6 4 2 1 2 0 5 4 3 0 5 3 1 4 1 0 4 3 2 6 2 0 1 2 3 2 2 1 -110 3 1 1 2 110 1 2 3 4 5 1 2 0 5 4 3 0 5 3 1 4 1 0 4 3 2 6 2 0 1 2 4 3 1 6 0 4 3 2 6 0 1 6 1 2 70 3 2 2 1 -110 3 1 1 2 110 1 2 6 */依旧上一年的想法,课间写了好多页本
需要原理就点赞,火了有动力写原理(很晚了而已)
与以往作品《纯数学表达式实现布尔逻辑与条件分支》有关系,求解(qqvi)公式就是依靠了那个(虽然之间写判断更快),看起来非常好看
bfs也可求最优解(依靠这个方法)
hkqi