/*A170876的C++源代码,Richard J.Mathar,2010年1月8日*/#包括#包括使用命名空间标准;/*如果要创建GNUPLOT(1)文件,请定义宏PRINT_GNUPLOT,如gnuplot卫星<<++设置终端postscript纵向增强颜色未设置边界设置尺寸1,0.75设置视图70,60设置ticslevel 0设置x范围[-5:5]设置yrange[-5:5]设置zrange[-5:5]设置格式x“”设置格式y“”设置格式z“”未设置tics加载“a170876.out”++Gv a170876*.eps公司*//**三维简单立方整数网格中的点*/Pt类{公众:/**三个笛卡尔坐标*/整数x,y,z;点(int X,int Y,int Z):X(X),Y(Y),Z(Z){}} ; /* 铂*//**一根长度为2的牙签在3D简单立方网格中,*与三个坐标轴之一对齐。*/Tp级{公众:/*它的两个终点*/第a部分;铂b;/*三个笛卡尔坐标系的构造函数*两端各一个*/Tp(整数x1,整数y1,整数z1,整数x2,整数y2,整数z2):a(x1,y1,z1),b(x2,y2,z2){}/**计算穿过牙签的两根牙签(从st到en)*在en点。*/静态矢量perp(常数点(&S),常数点(&E){如果(st.x==en.x&&st.y==en.j)/*原始齿尖垂直*/{Tp-fi(en.x-1,en.y,en.z,en.x+1,en.y,en.z);Tp se(英语.x、英语.y-1、英语.z、英语.x,英语.y+1,英语.z);矢量物件;res.push_back(fi);res.push_back(se);返回res;}else如果(st.y==en.y&&st.z==en.j)/*水平平行于x*/{ Tp-fi(en.x,en.y-1,en.z,en.x,en.y+1,en.z);Tp se(英语.x、英语.y、英语.z-1、英语.x,英语.y,英语.z+1);矢量物件;res.push_back(fi);res.push_back(se);返回res;}else/*与y水平平行*/{Tp-fi(en.x-1,en.y,en.z,en.x+1,en.y,en.z);Tp se(英语.x、英语.y、英语.z-1、英语.x,英语.y,英语.z+1);矢量物件;res.push_back(fi);res.push_back(se);返回res;}}/*如果点pt是这个tootpick的端点之一,则返回true。*/布尔具有(const Pt&Pt)const{返回(pt.x==a.x&pt.y==a.y&pt.z==a.z||pt.x==b.x&&pt.y==b.y&&pt.z==b.z);}/*如果点pt是此tootpick的中点,则返回true。*/布尔有Mid(const Pt&Pt)const{返回(2*pt.x==a.x+b.x&&2*pty==a.y+b.y&&2*pt.z==a.z+b.z);}}; /* 时间点*//**牙签套装*/TpS类{公众:/**全套牙签*/矢量ts;/*构造一个已知牙签向量*/TpS(矢量&英寸):ts(英寸){}/**OEIS主要功能:计算牙签数量*/int cnt()常量{返回ts.size();}/**如果p是这组牙签的端点或中点,则返回true*/布尔isExp(const Pt&p)const{/*扫描套装中的所有牙签,并将计数器增加*每次p是终点时为1,如果p是中点,则为2*/整数cnt=0;for(int i=0;i<ts.size();i++){如果(ts[i].has(p))cnt++;if(ts[i].hasMid(p))碳纳米管+=2;}/*如果计数器为1,则返回true,否则为false*/返回(cnt==1);}/**归还下一代牙签,包括*当前集合(代)的tootpick。*/TpS nextg()常量{/*新一代,最初是空的*/矢量物件;/*扫描当前集合中的所有tootpick*/for(int i=0;i<ts.size();i++){/*如果电流中的嘟嘟声两端之一*set是一个暴露点,构造tootpick十字*并在新一代产品中添加两个tootpicks。*/if(isExp(ts[i].a)){//cout<<“is ex”<<ts[i].a.x<<“”<<ts[i].a.y<<endl;矢量n=Tp::perp(ts[i].b,ts[i].a);res.push_back(n[0]);res.push_back(n[1]);}if(isExp(ts[i].b)){//cout<<“is ex”<<ts[i].b.x<<“”<<ts[i].b.y<<endl;矢量n=Tp::perp(ts[i].a,ts[i].b);res.push_back(n[0]);res.push_back(n[1]);}}#ifdef打印_GNUPLOT/*调试:打印gnuplot的状态(1)*/for(int i=0;i<res.size();i++){cout<<“设置箭头自”<<res[i].a.x<<“,”<<res[i].b.x<<“,”<<res[i].b.y<<“<<endl;}#结尾/*附加当前牙签*/for(int i=0;i<ts.size();i++){res.push_back(ts[i]);#ifdef打印_GNUPLOTcout<<“设置箭头自”<<ts[i].a.x<<“,”<<ts[i].a.y<<“,”<<ts[i].a.z<<“至”<<ts[i].b.x<<“,”<<endl;#结尾}#ifdef打印_GNUPLOTcout<<“splot\”a170876.nul \“notitle wi li”<<endl;cout<<“unset arrow”<<endl;#结尾返回res;}};/*主要功能。没有命令行参数。Shell命令:*gcc-o a170876 a170876.cpp#在给定a170876.cpp的情况下创建一个170876*a170876>a170876输出*a170876.gp#创建a170876_2.eps、a170876-3.eps*/int main(int argc,char*argv[]){#ifndef打印_GNUPLOTcout<<“0,”;#结尾/*从一个指向(0,0,-1)到(0,0,1)的tootpick开始*/Tp rol(0,0,-1,0,0,1);矢量腐烂;旋转推送(rol);/*用牙签组初始化第一代*只含这一根牙签*/TpS根(腐烂);/*增量生成*/对于(整数g=2;g<30;g++){/*打印该代牙签的当前总数*/#ifndef打印_GNUPLOTcout<<root.cnt()<<“,\n”;#其他cout<<“#g=”<<g<<“”<<root.cnt()<<endl;cout<<“设置输出”a170876_“<<g<<”.eps\n“;#结尾/*在露出的地方加上牙签*/TpS g=root.nextg();根=g;}cout<<endl;}