本网站由以下捐款支持:OEIS基金会.

完成非自相邻路径:程序

来自OeisWiki
跳转到:航行,搜索
/*文件名:CNSAP.cpp目的:计算由不同大小的矩形和矩形包围的正方形和立方格子中的所有完整非自相邻路径(CNSAP)分别为长方体。生成信息:程序使用Microsoft Visual C++速成版生成为控制台项目,并且需要包含头文件的头文件stdafx.h:#包括<iomanip>#包括<iostream>#包括<fstream发展历史:最初由Tom Young于2010年7月和8月开发。随后由Chris Gribble开发。*/#包括“stdafx.h”使用名称空间系统;使用命名空间标准;const int maxDirections=6;/*节点可以进行路径前进的最大方向数*/常量int maxLengths=343;/*允许的最大不同CNSAP长度数*/const int maxNodes=343;/*有界晶格中允许的最大节点数*/常量int maxNeighborsPlus3=9;/*一个节点可以具有的最大邻居数(6)加上3*/const int maxShapes=5000000;/*允许的最大不同CNSAP形状数*/long long i_ll;/*循环计数器*/long-long numberOfPathsPerLength[最大长度];/*每个长度的路径数*/long long numberOfShapesPerLength[最大长度];/*每个长度的不同路径形状的数量*/long long endNodePerLength[maxNodes][maxLengths];/*每个结束节点的每个长度的路径数*/长长路径NodePerLength[maxNodes][maxLengths];/*每个路径节点的每个长度的路径数*/long long startNodePerLength[maxNodes][maxLengths];/*每个起始节点的每个长度的路径数*/long-long-endNode[maxNodes];/*每个结束节点的路径数*/long-long pathNode[maxNodes];/*每个路径节点的路径数*/long-long-startNode[maxNodes];/*每个起始节点的路径数*/long long startEndNode[maxNodes][maxNodes];/*每个起始-结束节点对的路径数*/long-long totalNumberOfPaths;/*路径总数*/long-long totalNumberOfShapes;/*不同路径形状的总数*/int currentPath[maxNodes];/*正在构建的当前路径中的节点序列*/int nodeNeighbors[maxNodes][maxNeighbarsPlus3];/*创建节点邻居阵列:*//*列0未使用,是从Liberty Basic转换到C++的工件*//*第1列包含邻居的数量*//*第2列至第7列包含相邻节点的值*//*第8列包含值-1*//*int numberOfPathsPerShape[maxShapes];/*每个不同形状的路径数。*/int个不可用节点[maxNodes][maxNeighborsPlus3];/*创建路径时,会记录路径节点的起始节点和未使用的邻居*//*无法在其中供将来使用*/int个未使用的节点[maxNodes][maxNeighborsPlus3];/*记录接管所有构建的CNSAP的每个节点的未使用邻居*//*当一条路再也走不开时,我们就回溯过去,利用第一条路*//*可用的未使用节点邻居来构造新路径*/整型a、b、c;/*晶格边界在x、y和z方向上的尺寸*/整数i,j,k,m,n;/*循环计数器*/int candidateNextNode;/*路径中下一个节点的候选节点*/int currentNode;/*正在构建的路径末端的当前节点*/int当前节点指针;/*指向正在构建的路径中的当前节点*/int firstNode;/*所有CNSAP中用户指定的第一个节点*/int latticeDimension;/*用户指定的晶格尺寸(2或3)*/int最长CNSAP;/*用于路径显示控制的当前最长CNSAP的长度*/int matchCount;/*firstNode与secondNode不匹配的邻居的计数*/int minPathLength,maxPathLeng,路径长度;/*最小、最大和当前CNSAP长度*/int nextNeighborPointer;/*指向下一个节点邻居*/int nextUnusableNodePointer;/*指向下一个不可用的节点插槽*/int个节点数;/*有界晶格中的节点数*/int numberOfSecondNodes;/*用户指定的第二个节点数*/int secondNode;/*用户指定的第二个节点*/bool addNode;/*指示是否可以将candidateNextNode添加到正在构造的路径中*/bool anyUnusedNodes;/*指示是否有任何未使用的节点用于路径构建*/bool已完成;/*指示程序运行是否完成*/bool noNextNode;/*指示是否可以扩展路径。如果不是,则为CNSAP*/bool形状匹配;/*指示当前CNSAP的形状是否已记录*/bool不可用;/*指示节点是否记录为不可用*/char currentPathDirections[maxNodes];/*与当前路径相对应的方向指示器序列*/char distinctPathShapes[maxShapes][maxNodes];/*生成了一组不同的CNSAP形状*/char nodeNeighborDirections[maxNodes][maxDirections];/*指示每个节点的每个邻居的方向:*//*r=右侧(+x),l=左侧(-x),u=向上(+y),d=向下(-y),a=上方(+z),b=下方(-z)*/char rotatedPathDirections[maxNodes];/*等效于currentPathDirections,适当旋转*/char allStartNodes;/*用户要求生成从每个节点或一个特定节点(Y或N)开始的路径*/char outputAllPaths;/*用户要求输出所有路径(Y或N)*/char outputShapeStats;/*用户要求输出路径形状统计信息*/char specifySecondNodes;/*用户要求指定一个或多个第二节点(Y或N)*/int main(){/*该程序确定矩形或立方晶格包围的正方形晶格中所有完整非相邻路径(CNSAP)的集合以长方体为界。特别是,它决定了它们的长度和形状,与旋转无关。在2D模式下,系统会提示用户提供矩形a和b的尺寸。在3D模式下,系统会提示用户提供长方体a、b和c的尺寸。用户可以选择从晶格中的所有节点生成所有路径,也可以选择从用户指定的起始节点对生成所有路径。程序的第一部分确定相关晶格中每个节点的邻居集。选择2D晶格的节点编号约定为:a=b=2 0 12  3a=2,b=30 12  34  5a=3,b=2 0 1 23  4  5a=b=3 0 1 23  4  56  7  8a=b=4 0 1 2 34  5  6  78  9 10 1112 13 14 15a=b=5 0 1 2 3 45  6  7  8  910 11 12 13 1415 16 17 18 1920 21 22 23 24方向命名约定:在a=b=2中,节点0位于节点1的左侧,从节点2向上节点3位于节点2的右侧,从节点1向下选择三维晶格的节点编号约定为:a=b=c=2 0 12  34  56  7a=b=c=3 0 1 23  4  56  7  89 10 1112 13 1415 16 1718 19 2021 22 2324 25 26a=b=c=4 0 1 2 34  5  6  78  9 10 1112 13 14 1516 17 18 1920 21 22 2324 25 26 2728 29 30 3132 33 34 3536 37 38 3940 41 42 4344 45 46 4748 49 50 5152 53 54 5556 57 58 5960 61 62 63方向命名约定:在a=b=c=2中,节点0位于节点1的左侧,从节点2向上,在节点4上方节点7在节点6的右侧,在节点5的下方,在节点3的下方*//*创建输出文件*/fstream文件;文件.open(“CNSAP.txt”,ios_base::out|ios_base::trunc);/*初始化变量*/最长CNSAP=0;/*将目前遇到的最长路径设置为零*/totalNumberOfShapes=0;/*将遇到的不同路径形状的数量设置为零*/对于(i=0;i<最大节点;i++)numberOfShapesPerLength[i]=0;/*获取晶格类型*/cout<<“输入晶格尺寸[2=2D/3=3D]”;cin>>格维数;if(latticeDimension!=2&&latticeDimension!=3)goto错误;if(晶格维度==2){/*获取晶格的尺寸*/cout<<“输入矩形长度>1,a=”;/*获取长度尺寸a a a a*/cin>>a;如果(a<2)goto错误;cout<<“输入矩形宽度>1,b=”;/*获取宽度尺寸b*/cin>>b;/*b条*//*b条*//*b条*/如果(b<2)goto错误;numberOfNodes=a*b;if(numberOfNodes>maxNodes)goto错误;file<<“Lattice有2个维度”<<endl;文件<<“矩形的长度,a=”<<a<<endl;file<<“矩形宽度,b=”<<b<<endl;/*初始化最小和最大路径长度*/minPathLength=节点数;最大路径长度=0;/*程序的第一部分创建邻居数组。程序的这一部分分为三个部分*//*确保阵列干净*/对于(i=0;i<numberOfNodes;i++){对于(k=1;k<maxNeighborsPlus3;k++){nodeNeighbors[i][k]=0;}对于(k=0;k<最大方向;k++){nodeNeighborDirections[i][k]=“”;}}/*第一部分确定晶格的角点,每个角点有两个相邻点*//*并识别它们*//*第一部分*//*左上角*/n=0;nodeNeighbors[n][1]=2;nodeNeighbors[n][2]=1;nodeNeighbors[n][3]=a;nodeNeighborDirections[n][0]='r';/*节点1距离节点0只有一步之遥*/nodeNeighborDirections[n][1]='d';/*节点a比节点0低一步*//*右上角*/n=a-1;nodeNeighbors[n][1]=2;nodeNeighbors[n][2]=a-2;nodeNeighbors[n][3]=2*a-1;nodeNeighborDirections[n][0]='l';/*节点(a-2)距离节点(a-1)还剩一步*/nodeNeighborDirections[n][1]='d';/*节点(2a-1)是节点(a-1)的下一步*//*左下角*/n=a*b-a;节点邻居[n][1]=2;nodeNeighbors[n][2]=a*b-2*a;nodeNeighbors[n][3]=a*b-a+1;nodeNeighborDirections[n][0]='u';/*节点(ab-2a)是节点(ab-a)的上一级*/nodeNeighborDirections[n][1]='r';/*节点(ab-a+1)距离节点(ab-a)只有一步之遥*//*右下角*/n=a*b-1;nodeNeighbors[n][1]=2;nodeNeighbors[n][2]=a*b-a-1;nodeNeighbors[n][3]=a*b-2;nodeNeighborDirections[n][0]='u';/*节点(ab-a-1)是节点(ab-1)的上一级*/nodeNeighborDirections[n][1]='l';/*节点(ab-2)距离节点(ab-1)只剩一步*//*第二部分计算出有3个邻居的晶格点*//*这些点位于矩形的4条边上,不是角点*//*第二部分*//*长度[a]方向的边。如果a=2,则不会执行此操作,因为那时没有边节点*/如果(a>2){/*上边缘*/对于(i=1;i<=a-2;i++){nodeNeighbors[i][1]=3;nodeNeighbors[i][2]=i-1;nodeNeighbors[i][3]=i+1;nodeNeighbors[i][4]=i+a;nodeNeighborDirections[i][0]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][1]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/}/*底部边缘*/对于(i=a*b-a+1;i=a*b-2;i++){nodeNeighbors[i][1]=3;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+1;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i只有一步之遥*/}}/*长度[b]方向的边*/如果(b>2){/*左侧边缘*/对于(i=a;i<=a*b-2*a;i+=a){nodeNeighbors[i][1]=3;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i+1;节点邻居[i][4]=i+a;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/}/*右侧边缘*/对于(i=2*a-1;i<=a*b-a-1;i+=a){节点邻居[i][1]=3;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+a;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/}}/*第三部分确定了具有4个邻居的晶格点*//*这些点都位于矩形内*//*第三部分*/对于(i=0;i<numberOfNodes;i++){if(nodeNeighbors[i][1]==0){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+1;nodeNeighbors[i][5]=i+a;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][3]='d';/*节点i+a比节点i低一步*/}}}else if(晶格维度==3){/*获取晶格的尺寸*/cout<<“输入长方体的长度,a=”;/*获取长度尺寸a a a a*/cin>>a;如果(a<2)goto错误;cout<<“输入长方体的宽度,b=”;/*获取宽度尺寸b*/cin>>b;/*b条*//*b条*//*b条*/如果(b<2)goto错误;cout<<“输入长方体高度,c=”;/*获取高度尺寸c*/cin>>c;/*c(c)*//*c(c)*//*c(c)*/如果(c<2)goto错误;numberOfNodes=a*b*c;if(numberOfNodes>maxNodes)goto错误;file<<“Lattice有3个维度”<<endl;file<<“长方体长度,a=”<<a<<endl;file<<“长方体宽度,b=”<<b<<endl;file<<“长方体高度,c=”<<c<<endl;/*初始化最小和最大路径长度*/minPathLength=节点数;最大路径长度=0;/*程序的第一部分创建邻居数组。程序的这一部分有4个部分*//*确保阵列干净*/对于(i=0;i<numberOfNodes;i++){对于(k=1;k<maxNeighborsPlus3;k++){节点邻居[i][k]=0;}}/*第一部分找到晶格的角点,并为它们指定数字3,因为它们有三个邻居*//*然后,计算出每个角落的邻居*//*第一部分*//*上表面,左上角*/n=0;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n+1;nodeNeighbors[n][3]=n+a;nodeNeighbors[n][4]=n+a*b;nodeNeighborDirections[n][0]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][1]='d';/*节点n+a是节点n的下一步*/nodeNeighborDirections[n][2]=“b”;/*节点n+ab比节点n低一步*//*上表面,右上角*/n=a-1;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-1;nodeNeighbors[n][3]=n+a;nodeNeighbors[n][4]=n+a*b;nodeNeighborDirections[n][0]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][1]='d';/*节点n-a是节点n的下一步*/nodeNeighborDirections[n][2]=“b”;/*节点n+ab比节点n低一步*//*上表面,左下角*/n=a*b-a;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a;nodeNeighbors[n][3]=n+1;节点邻居[n][4]=n+a*b;nodeNeighborDirections[n][0]='u';/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][1]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][2]='b';/*节点n+ab比节点n低一步*//*上表面,右下角*/n=a*b-1;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a;nodeNeighbors[n][3]=n-1;nodeNeighbors[n][4]=n+a*b;nodeNeighborDirections[n][0]='u';/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][1]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][2]=“b”;/*节点n+ab比节点n低一步*//*下表面,左上角*/n=a*b*c-a*b;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n+1;nodeNeighbors[n][4]=n+a;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][2]='d';/*节点n+a是节点n的下一步*//*下表面,右上角*/n=a*b*c-a*b+a-1;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-1;nodeNeighbors[n][4]=n+a;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][2]='d';/*节点n+a是节点n的下一步*//*下表面,左下角*/n=a*b*c-a;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a*b;节点邻居[n][3]=n-a;nodeNeighbors[n][4]=n+1;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='r';/*节点n+1距离节点n正好一步*//*下表面,右下角*/n=a*b*c-1;nodeNeighbors[n][1]=3;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-a;nodeNeighbors[n][4]=n-1;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='l';/*节点n-1距离节点n还有一步*//*第二部分计算出有4个邻居的晶格点*//*这些点位于立方体的边上*//*因为有十二条边,所以我们需要十二个环*//*第二部分*//*长度[a]方向上的顶面和底面边缘。如果a=2,则不会执行此操作,因为那时没有边节点*/如果(a>2){对于(i=1;i<=a-2;i++){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-1;nodeNeighbors[i][3]=i+1;nodeNeighbors[i][4]=i+a;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][1]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=a*b-a+1;i=a*b-2;i++){nodeNeighbors[i][1]=4;节点邻居[i][2]=i-a;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+1;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='u';/*节点i-a比节点i高一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i只有一步之遥*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=a*b*c-a*b+1;i<=a*b*c-a*b+a-2;i++){节点邻居[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+1;nodeNeighbors[i][5]=i+a;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][3]='d';/*节点i+a比节点i低一步*/}对于(i=a*b*c-a+1;i<=a*b*c-2;i++){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;nodeNeighbors[i][4]=i-1;nodeNeighbors[i][5]=i+1;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][3]='r';/*节点i+1距离节点i只有一步之遥*/}}/*长度[b]方向上的顶面和底面边缘*/如果(b>2){对于(i=a;i<=a*b-2*a;i+=a){节点邻居[i][1]=4;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i+1;nodeNeighbors[i][4]=i+a;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=2*a-1;i<=a*b-a-1;i+=a){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+a;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='u';/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=a*b*c-a*b+a;i<=a*b*c-2*a;i+=a){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;nodeNeighbors[i][4]=i+1;nodeNeighbors[i][5]=i+a;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][3]='d';/*节点i+a比节点i低一步*/}对于(i=a*b*c-a*b+2*a-1;i<=a*b*c-a-1;i+=a){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;nodeNeighbors[i][4]=i-1;节点邻居[i][5]=i+a;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][3]='d';/*节点i+a比节点i低一步*/}}/*侧面边缘*/如果(c>2){对于(i=a*b;i<=a*b*c-2*a*b){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i+1;nodeNeighbors[i][4]=i+a;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/nodeNeighborDirections[i][1]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=a*b+a-1;i<=a*b*c-2*a*b+a-1;i+=a*b){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-1;nodeNeighbors[i][4]=i+a;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/nodeNeighborDirections[i][1]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][2]='d';/*节点i+a比节点i低一步*/nodeNeighborDirections[i][3]='b';/*节点i+ab比节点i低一步*/}对于(i=2*a*b-a;i<=a*b*c-a*b-a;i+=a*b){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;节点邻居[i][4]=i+1;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='r';/*节点i+1距离节点i仅一步之遥*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}对于(i=2*a*b-1;i<=a*b*c-a*b-1;i+=a*b){nodeNeighbors[i][1]=4;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;nodeNeighbors[i][4]=i-1;nodeNeighbors[i][5]=i+a*b;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='l';/*节点i-1距离节点i还有一步*/节点相邻方向[i][3]=“b”;/*节点i+ab比节点i低一步*/}}/*第三部分*//*面内侧的每个晶格点都有5个邻居*/如果(a>2&&b>2){/*顶面*/对于(i=1;i<=b-2;i++){对于(k=1;k<=a-2;k++){n=i*a+k;nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a;nodeNeighbors[n][3]=n-1;nodeNeighbors[n][4]=n+1;nodeNeighbors[n][5]=n+a;nodeNeighbors[n][6]=n+a*b;nodeNeighborDirections[n][0]='u';/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][1]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][2]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][3]='d';/*节点n+a比节点n低一步*/nodeNeighborDirections[n][4]=“b”;/*节点n+ab比节点n低一步*/}}/*底面*/对于(i=1;i<=b-2;i++){对于(k=1;k<=a-2;k++){n=i*a+k+a*b*(c-1);nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a*b;节点邻居[n][3]=n-a;nodeNeighbors[n][4]=n-1;nodeNeighbors[n][5]=n+1;nodeNeighbors[n][6]=n+a;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][3]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][4]='d';/*节点n+a是一个下移节点n*/}}}如果(a>2&&c>2){/*正面*/对于(i=1;i<=c-2;i++){对于(k=1;k<=a-2;k++){n=(i+1)*a*b+k-a;nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-a;nodeNeighbors[n][4]=n-1;nodeNeighbors[n][5]=n+1;nodeNeighbors[n][6]=n+a*b;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][3]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][4]=“b”;/*节点n+ab比节点n低一步*/}}/*背面*/对于(i=1;i<=c-2;i++){对于(k=1;k<=a-2;k++){n=i*a*b+k;nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-1;nodeNeighbors[n][4]=n+1;节点邻居[n][5]=n+a;nodeNeighbors[n][6]=n+a*b;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][2]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][3]='d';/*节点n+a是节点n的下一步*/nodeNeighborDirections[n][4]=“b”;/*节点n+ab比节点n低一步*/}}}如果(b>2&&c>2){/*右脸*/对于(i=1;i<=c-2;i++){对于(k=1;k<=b-2;k++){n=i*a*b+a*k+a-1;nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-a;nodeNeighbors[n][4]=n-1;nodeNeighbors[n][5]=n+a;nodeNeighbors[n][6]=n+a*b;nodeNeighborDirections[n][0]='a';/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='l';/*节点n-1距离节点n还有一步*/nodeNeighborDirections[n][3]='d';/*节点n+a是节点n的下一步*/nodeNeighborDirections[n][4]=“b”;/*节点n+ab比节点n低一步*/}}/*左侧*/对于(i=1;i<=c-2;i++){对于(k=1;k<=b-2;k++){n=i*a*b+k*a;nodeNeighbors[n][1]=5;nodeNeighbors[n][2]=n-a*b;nodeNeighbors[n][3]=n-a;nodeNeighbors[n][4]=n+1;nodeNeighbors[n][5]=n+a;nodeNeighbors[n][6]=n+a*b;nodeNeighborDirections[n][0]=“a”;/*节点n-ab比节点n高一步*/nodeNeighborDirections[n][1]=“u”;/*节点n-a是节点n的上一步*/nodeNeighborDirections[n][2]='r';/*节点n+1距离节点n只有一步之遥*/nodeNeighborDirections[n][3]='d';/*节点n+a是节点n的下一步*/nodeNeighborDirections[n][4]=“b”;/*节点n+ab比节点n低一步*/}}}/*第四部分*//*每个其他节点必须位于长方体内部,并且有6个相邻节点*/对于(i=0;i<numberOfNodes;i++){if(nodeNeighbors[i][1]==0){nodeNeighbors[i][1]=6;nodeNeighbors[i][2]=i-a*b;nodeNeighbors[i][3]=i-a;nodeNeighbors[i][4]=i-1;nodeNeighbors[i][5]=i+1;nodeNeighbors[i][6]=i+a;nodeNeighbors[i][7]=i+a*b;nodeNeighborDirections[i][0]='a';/*节点i-ab比节点i高一步*/节点相邻方向[i][1]=“u”;/*节点i-a是节点i的上一步*/nodeNeighborDirections[i][2]='l';/*节点i-1距离节点i还有一步*/nodeNeighborDirections[i][3]='r';/*节点i+1距离节点i只有一步之遥*/nodeNeighborDirections[i][4]=“d”;/*节点i+a比节点i低一步*/节点相邻方向[i][5]=“b”;/*节点i+ab比节点i低一步*/}}}/*将nodeNeighbors末尾的所有零都更改为-1…程序的其余部分都需要这样做*/对于(i=0;i<numberOfNodes;i++){for(j=nodeNeighbors[i][1]+2;j<maxNeighborsPlus3;j++){nodeNeighbors[i][j]=-1;}}/*获取输出要求*/cout<<“输出所有路径?[y/n]”;cin>>输出所有路径;file<<“Output all paths=”<<outputAllPaths<<endl;if(outputAllPaths!=“y”&&output所有路径!=“n”)goto错误;cout<<“输出形状统计数据?[y/n]”;cin>>outputShapeStats;file<<“Output shape stats=”<<outputShapeStats<<endl;if(outputShapeStats!=“y”&&outputSapeStats;=“n”)goto错误;/*获取起始节点要求*/cout<<“使用所有启动节点运行?[y/n]”;cin>>所有StartNodes;file<<“使用所有启动节点运行=”<<allStartNodes<<endl;if(allStartNodes!=“y”&&allStartNode!=“n”)goto错误;if(allStartNodes=='n'){/*从用户特定的第一个节点开始生成所有CNSAP,也可以从一个或多个第二个节点开始*//*初始化包含无效节点号-1的节点值的数组*/对于(i=0;i<numberOfNodes;i++){当前路径[i]=-1;对于(k=1;k<maxNeighborsPlus3;k++){不可用节点[i][k]=-1;未使用节点[i][k]=-1;}}/*提示用户输入第一个节点*/cout<<“键入第一个节点号”;cin>>firstNode;文件<<“First node=”<<firstNode<<endl;if(firstNode<0||firstNode>numberOfNodes-1)goto错误;当前节点指针=0;currentPath[currentNodePointer]=第一个节点;/*将第一个节点放置在路径中*/unusableNodes[currentNodePointer][1]=第一个节点;/*确保第一个节点不能在此路径中再次使用*//*是否需要一个或多个第二节点*/cout<<“您想输入一个或多个第二个节点吗?[y/n]”;cin>>指定SecondNodes;file<<“Second node requirement=”<<specifySecondNodes<<endl;if(specifySecondNodes==“y”){currentNodePointer++;cout<<“多少个第二节点?”;cin>>秒节点数;file<<“Number of second nodes=”<<numberOfSecondNodes<<endl;if(numberOfSecondNodes<0||numberOfSecondNodes>nodeNeighbors[firstNode][1])goto错误;对于(i=1;i<=秒节点数;i++){cout<<“键入第二个节点号”;cin>>第二节点;文件<<“Second node=”<<secondNode<<endl;matchCount=0;对于(j=1;j<=nodeNeighbors[firstNode][1];j++){if(secondNode!=节点邻居[firstNode][j+1])matchCount++;}if(matchCount==nodeNeighbors[firstNode][1])转到错误;/*输入的第二个节点不是第一个节点的邻居*/如果(i==1){/*将初始第二个节点放置在路径中,并将第一个节点的所有邻居注册为不可用*/currentPath[currentNodePointer]=第二个节点;对于(j=1;j<=nodeNeighbors[firstNode][1];j++){unusableNodes[currentNodePointer][j]=节点邻居[firstNode][j+1];}}其他的{/*检查是否尚未指定此备用第二个节点*/if(secondNode==currentPath[当前节点指针])goto错误;对于(j=1;j<i;j++){if(secondNode==未使用的节点[currentNodePointer][j])goto错误;}/*由于尚未指定,请将其存储为未使用的节点以供将来使用*/未使用节点[currentNodePointer][i-1]=第二个节点;}}}cout<<endl;文件<<endl;/*从指定的第一个和第二个节点开始计算所有CNSAP*/完成=假;while(完成==false){noNextNode=假;while(noNextNode==false){/*指向第一个邻居*/nextNeighborPointer=2;currentNode=当前路径[当前节点指针];{candidateNextNode=节点邻居[currentNode][nextNeighborPointer];/*现在检查是否可以在路径中包含此节点*/addNode=true;for(j=0;j<=currentNodePointer;j++){对于(k=1;k<maxNeighborsPlus3;k++){if(candidateNextNode==不可用节点[j][k]){addNode=false;断裂;}}if(addNode==false)断裂;}nextNeighborPointer++;}while(addNode==false&&candidateNextNode!=-1);/*为了在程序中达到这一点,我们要么在路径中找到了下一个节点,要么路径已经完成*/if(candidateNextNode==-1)noNextNode=true;if((noNextNode==false)&&(addNode==true)){当前节点指针++;currentPath[currentNodePointer]=候选NextNode;/*因为我们已经将节点添加到路径中,所以使其可用的邻居不可用*/nextUnusableNodePointer=1;对于(i=1;i<=nodeNeighbors[当前路径[当前节点指针-1]][1];i++){不可用=假;对于(j=0;j<当前节点指针;j++){对于(k=1;k<maxNeighborsPlus3;k++){if(不可用节点[j][k]==-1)断裂;if(nodeNeighbors[currentPath[current NodePointer-1]][i+1]==不可用节点[j][k])unusable=true;}}if(不可用==false){/*此节点邻居尚未不可用,请将其设置为可用*/unusableNodes[currentNodePointer][nextUnusableNodePointer]=节点邻居[current路径[当前节点指针-1]][i+1];下一个不可用节点指针++;}}/*将当前路径中所有未使用的不可用节点记录为可用于未来路径*/对于(i=2;i<maxNeighborsPlus3;i++){unusedNodes[currentNodePointer][i-1]=不可用节点[current节点指针][i];}}}/*路径已完成,因为我们没有找到下一个节点的候选节点*/if(outputAllPaths=='n'){if(currentNodePointer+1>=最长的CNSAP){cout<<“Path=”;文件<<“Path=”;对于(i=0;i<=当前节点指针;i++){cout<<“”<<当前路径[i];文件<<“”<<当前路径[i];}cout<<“;Length=”<<currentNodePointer+1<<endl;file<<“;Length=”<<currentNodePointer+1<<endl;最长CNSAP=当前节点指针+1;}}其他的{cout<<“Path=”;文件<<“Path=”;对于(i=0;i<=当前节点指针;i++){cout<<“”<<当前路径[i];文件<<“”<<当前路径[i];}cout<<“;Length=”<currentNodePointer+1<endl;文件<<“;长度=”<<currentNodePointer+1<<endl;}/*增加此长度的路径数*/路径长度=当前节点指针+1;numberOfPathsPerLength[pathLength]=NumberOf路径PerLength[路径长度]+1;/*确定最小和最大路径长度*/minPathLength=min(minPathLongth,pathLengton);maxPathLength=最大值(maxPathLongth,pathLengment);/*继续CNSAP建设,直到没有未使用的节点*/anyUnusedNodes=true;while(anyUnusedNodes==true){if(未使用的节点[currentNodePointer][1]!=-1){anyUnusedNodes=false;currentPath[currentNodePointer]=未使用的节点[当前节点指针][1];对于(i=1;i<maxNeighborsPlus3;i++){未使用节点[currentNodePointer][i]=未使用节点[当前节点指针][i+1];当前路径[当前节点指针+i]=-1;}}其他的{/*当前节点没有更多可以分支到的邻居,因此我们必须从unusableNodes数组中清除这些节点*//*以便可以插入下一个当前节点的邻居*/对于(i=1;i<maxNeighborsPlus3;i++){不可用节点[当前节点指针][i]=-1;}/*回溯到上一个节点*/当前节点指针--;}if(当前节点指针==0){finished=true;anyUnusedNodes=false;}}}文件<<endl<<“列标题:”<<endl;文件<<“L=路径长度”<<endl;file<<“N=长度为L的路径总数”<<endl<<end1;文件<<“L N”<<endl;路径总数=0;for(i=最小路径长度;i<=最大路径长度;i++){文件<<i<<“”<<numberOfPathsPerLength[i]<<““”<<endl;totalNumberOfPaths=路径总数+每长度路径数[i];}文件<<“Total”<<totalNumberOfPaths<<“”<<endl<<endl;}其他的{/*生成从每个节点开始的所有路径*/文件<<endl;对于(m=0;m<节点数;m++){/*初始化变量*/对于(i=0;i<numberOfNodes;i++){当前路径[i]=-1;对于(k=1;k<maxNeighborsPlus3;k++){不可用节点[i][k]=-1;未使用节点[i][k]=-1;}}当前节点指针=0;当前路径[当前节点指针]=m;不可用节点[当前节点指针][1]=m;/*设置第一个节点,以便计算从该节点发出的所有CNSAP*/完成=假;while(完成==false){noNextNode=假;while(noNextNode==false){nextNeighborPointer=2;currentNode=当前路径[当前节点指针];{candidateNextNode=节点邻居[currentNode][nextNeighborPointer];/*现在检查是否可以移动到此节点*/addNode=true;对于(j=0;j<=当前节点指针;j++){对于(k=1;k<maxNeighborsPlus3;k++){if(candidateNextNode==不可用节点[j][k]){addNode=false;断裂;}}if(addNode==false)断裂;}nextNeighborPointer++;}while(addNode==false&&candidateNextNode!=-1);/*为了在程序中达到这一点,我们要么在路径中找到下一个节点,要么路径已经完成*/if(candidateNextNode==-1)noNextNode=true;if((noNextNode==false)&&(addNode==true)){当前节点指针++;currentPath[currentNodePointer]=候选NextNode;currentPathDirections[currentNodePointer]=nodeNeighborDirections[currentNode][nextNeighbor指针-3];/*因为我们已经在路径中添加了一个节点,所以它的可用邻居不可用*/nextUnsableNodePointer=1;对于(i=1;i<=nodeNeighbors[当前路径[当前节点指针-1]][1];i++){不可用=假;对于(j=0;j<当前节点指针;j++){对于(k=1;k<maxNeighborsPlus3;k++){if(nodeNeighbors[currentPath[current NodePointer-1]][i+1]==不可用节点[j][k])unusable=true;}}if(不可用==错误){unusableNodes[currentNodePointer][nextUnusableNodePointer]=节点邻居[current路径[当前节点指针-1]][i+1];下一个不可用节点指针++;}}/*将当前路径中所有未使用的不可用节点记录为可用于未来路径*/对于(i=2;i<maxNeighborsPlus3;i++){unusedNodes[currentNodePointer][i-1]=不可用节点[current节点指针][i];}}}/*路径已完成,因为我们没有找到candidateNextNode*/如果(outputShapeStats=='n')转到skip_shapes;/*计算路径形状统计信息*//*旋转路径的方向表示,使起始方向为“向上”*/if(晶格维度==2){rotatedPathDirections[0]=“”;if(currentPathDirections[1]=='d'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='d')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“d”;}}else if(currentPathDirections[1]=='l'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='d')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='r';}}否则如果(currentPathDirections[1]=='r'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='d')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='u')rotatedPathDirections[i]='l';}}else if(currentPathDirections[1]=='u'){对于(i=1;i<=当前节点指针;i++){rotatedPathDirections[i]=当前路径方向[i];}}rotatedPathDirections[currentNodePointer+1]=“\0”;}else if(晶格维度==3){rotatedPathDirections[0]=“”;if(currentPathDirections[1]==“a”){j=2;while(currentPathDirections[j]=='a'){j++;}if(currentPathDirections[j]=='d'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='u';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='l';}}else if(currentPathDirections[j]=='l'){for(i=1;i<=currentNodePointer;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='u';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“d”;if(currentPathDirections[i]==“d”)rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“a”;}}else if(currentPathDirections[j]=='r'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='u';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“b”;}}else if(currentPathDirections[j]=='u'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='u';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='r';}}}else if(currentPathDirections[1]==“b”){j=2;while(currentPathDirections[j]=='b'){j++;}if(currentPathDirections[j]=='d'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='u';if(currentPathDirections[i]==“d”)rotatedPathDirections[i]='r';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='l';}}else if(currentPathDirections[j]=='l'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='u';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“b”;}}else if(currentPathDirections[j]=='r'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='b')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“l”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“a”;}}else if(currentPathDirections[j]=='u'){for(i=1;i<=currentNodePointer;i++){if(currentPathDirections[i]==“a”)rotatedPathDirections[i]=“d”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='u';if(currentPathDirections[i]=='d')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='r';}}}else if(currentPathDirections[1]==“d”){j=2;while(currentPathDirections[j]=='d'){j++;}if(currentPathDirections[j]=='a'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='r';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='l';if(currentPathDirections[i]=='d')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“d”;}}else if(currentPathDirections[j]=='b'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]==“a”)rotatedPathDirections[i]='l';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='r';if(currentPathDirections[i]=='d')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“d”;}}else if(currentPathDirections[j]=='l'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“d”;}}else if(currentPathDirections[j]=='r'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“d”;}}}else if(currentPathDirections[1]=='l'){j=2;while(currentPathDirections[j]=='l'){j++;}if(currentPathDirections[j]=='a'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]==“a”)rotatedPathDirections[i]='r';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='l';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“b”;}}else if(currentPathDirections[j]=='b'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='l';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='r';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“a”;}}否则如果(currentPathDirections[j]=='d'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='l';}}else if(currentPathDirections[j]=='u'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='l')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='r';}}}else if(currentPathDirections[1]=='r'){j=2;while(currentPathDirections[j]=='r'){j++;}if(currentPathDirections[j]=='a'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='r';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='l';if(currentPathDirections[i]=='d')rotatedPathDirections[i]='b';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“a”;}}else if(currentPathDirections[j]=='b'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='l';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“r”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='u')rotatedPathDirections[i]=“b”;}}else if(currentPathDirections[j]=='d'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='u')rotatedPathDirections[i]='l';}}else if(currentPathDirections[j]=='u'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='b';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]='u';if(currentPathDirections[i]=='u')rotatedPathDirections[i]='r';}}}else if(currentPathDirections[1]=='u'){j=2;while(currentPathDirections[j]=='u'){j++;}if(currentPathDirections[j]=='a'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='r';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='l';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='u';}}else if(currentPathDirections[j]=='b'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]='l';if(currentPathDirections[i]==“b”)rotatedPathDirections[i]='r';if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='r')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='u')rotatedPathDirections[i]='u';}}else if(currentPathDirections[j]=='l'){for(i=1;i<=currentNodePointer;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“b”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“a”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='u')rotatedPathDirections[i]='u';}}else if(currentPathDirections[j]=='r'){对于(i=1;i<=当前节点指针;i++){if(currentPathDirections[i]=='a')rotatedPathDirections[i]=“a”;if(currentPathDirections[i]==“b”)rotatedPathDirections[i]=“b”;if(currentPathDirections[i]=='d')rotatedPathDirections[i]=“d”;if(currentPathDirections[i]=='l')rotatedPathDirections[i]='l';if(currentPathDirections[i]=='r')rotatedPathDirections[i]='r';if(currentPathDirections[i]=='u')rotatedPathDirections[i]='u';}}}rotatedPathDirections[currentNodePointer+1]=“\0”;}/*使用此形状增加路径数*/if(totalNumberOfShapes==0){strcpy_s(distinctPathShapes[totalNumberOfShapes],rotatedPathDirections);/*每个形状的路径数[totalNumberOfShapes]=1;*/形状总数++;}其他的{shapeMatch=false;对于(i_ll=0;i_ll<=totalNumberOfShapes;i_ll++){if(strcmp(distinctPathShapes[i_ll],rotatedPathDirections)==0){shapeMatch=true;/*每个形状的路径数[i_ll]++;*/断裂;}}if(shapeMatch==false){strcpy_s(distinctPathShapes[totalNumberOfShapes],rotatedPathDirections);/*每个形状的路径数[totalNumberOfShapes]=1;*/形状总数++;}}跳过形状(_S):/*增加此长度的路径数*/路径长度=当前节点指针+1;numberOfPathsPerLength[路径长度]=numberOfPathsPerLength[路径长度]+1;/*为起始节点增加此长度的路径数*/startNodePerLength[currentPath[0]][pathLength]=startNode PerLength[当前路径[0]][路径长度]+1;/*为结束节点增加此长度的路径数*/endNodePerLength[currentPath[current NodePointer]][pathLength]=endNodeBerLength[currentPath[currrentNodePointer]][路径长度]+1;/*为路径中的每个节点增加此长度的路径数*/对于(i=0;i<=当前节点指针;i++){pathNodePerLength[currentPath[i]][pathLength]=路径节点PerLength[current路径[i]][path长度]+1;}/*确定最小和最大路径长度*/minPathLength=min(minPathLongth,pathLengton);maxPathLength=最大值(maxPathLongth,pathLengment);/*增加每个起始-结束节点对的路径数*/startEndNode[当前路径[0]][当前路径[当前节点指针]]=startEnd节点[当前路径[0]][现有路径[当前点指针]]+1;/*如果合适,显示路径*/if(outputAllPaths=='y'||(output1llPaths=='n'&&currentNodePointer+1>=最长的CNSAP){longestCNSAP=路径长度;cout<<“Path=”;文件<<“Path=”;对于(i=0;i<=当前节点指针;i++){cout<<“”<<当前路径[i];文件<<“”<<当前路径[i];}cout<<“;Length=”<<pathLength<<endl;文件<<“;长度=”<<pathLength<<endl;对于(i=1;i<=当前节点指针;i++){cout<<“”<<当前路径方向[i];文件<<“”<<当前路径方向[i];}cout<<endl;文件<<endl;}/*构造新的CNSAP,直到所有未使用的节点都用完为止*/anyUnusedNodes=true;while(anyUnusedNodes==true){if(未使用的节点[currentNodePointer][1]!=-1){anyUnusedNodes=false;currentPath[currentNodePointer]=未使用的节点[currentNodePointer][1];对于(i=1;i<=nodeNeighbors[当前路径[当前节点指针-1]][1];i++){if(currentPath[currentNodePointer]==nodeNeighbors[current Path[currentNodePointer-1]][i+1]){currentPathDirections[currentNodePointer]=nodeNeighborDirections[当前路径[当前节点指针-1]][i-1];断裂;}}对于(i=1;i<maxNeighborsPlus3;i++){未使用节点[currentNodePointer][i]=未使用节点[当前节点指针][i+1];当前路径[当前节点指针+i]=-1;}}其他的{/*当前节点没有更多的邻居可以分支,所以我们必须从unusableNodes数组中删除这些节点*//*以便可以插入下一个当前节点的邻居*/对于(i=1;i<maxNeighborsPlus3;i++){不可用节点[当前节点指针][i]=-1;}/*回溯到上一个节点*/当前节点指针--;}if(当前节点指针==0){finished=true;anyUnusedNodes=false;}}}}if(outputShapeStats==“y”){/*显示每个长度和形状的路径数*/for(i_ll=0;i_ll<totalNumberOfShapes;i_ll++){pathLength=strlen(distinctPathShapes[i_ll]);/*包含初始空间以指定路径中的节点数*/numberOfShapesPerLength[pathLength]=NumberOf形状PerLength[路径长度]+1;}文件<<endl<<“列标题:”<<endl;文件<<“L=路径长度”<<endl;file<<“N=长度为L的路径总数”<<endl;file<<“S=每个长度的不同路径形状数”<<endl<<endl;文件<<“L N S”<<endl;路径总数=0;对于(i=minPathLength;i<=maxPathLeng;i++){文件<<i<<“”<<numberOfPathsPerLength[i]<<“;totalNumberOfPaths=路径总数+每长度路径数[i];}文件<<“Total”<<totalNumberOfPaths<<“”<<totalNumber OfShapes<<endl;/*file<<“每个不同路径形状出现的次数”<<endl;文件<<“形状编号频率形状”<<endl;对于(i=0;i<totalNumberOfShapes;i++){文件<<i<<“”<<numberOfPathsPerShape[i]<<“;}文件<<endl;*/}其他的{文件<<endl<<“列标题:”<<endl;文件<<“L=路径长度”<<endl;file<<“N=长度为L的路径总数”<<endl<<endl;文件<<“L N”<<endl;路径总数=0;对于(i=minPathLength;i<=maxPathLeng;i++){文件<<i<<“”<<numberOfPathsPerLength[i]<<““”<<endl;totalNumberOfPaths=路径总数+每长度路径数[i];}文件<<“总计”<<totalNumberOfPaths<<“”<<endl<<endl;}文件<<“每个节点是每个长度(L)的路径中的起始节点(SN)的次数”<<endl;文件<<“SN”;对于(i=0;i<numberOfNodes;i++){文件<<i<<“”;}文件<<endl;文件<<“L”<<endl;对于(j=minPathLength;j<=maxPathLeng;j++){文件<<j<<“”;对于(i=0;i<numberOfNodes;i++){文件<<startNodePerLength[i][j]<<“”;startNode[i]=启动节点[i]+启动节点长度[i][j];}文件<<endl;}文件<<“总计”;对于(i=0;i<numberOfNodes;i++){文件<<startNode[i]<<“”;}文件<<endl<<endl;文件<<“每个节点是每个长度(L)路径中的结束节点(EN)的次数”<<endl;文件<<“EN”;对于(i=0;i<numberOfNodes;i++){文件<<i<<“”;}文件<<endl;文件<<“L”<<endl;对于(j=minPathLength;j<=maxPathLeng;j++){文件<<j<<“”;对于(i=0;i<numberOfNodes;i++){文件<<endNodePerLength[i][j]<<“”;endNode[i]=结束节点[i]+结束节点长度[i][j];}文件<<endl;}文件<<“总计”;对于(i=0;i<numberOfNodes;i++){文件<<endNode[i]<<“”;}文件<<endl<<endl;文件<<“每个节点(N)在每个长度(L)的路径中出现的次数”<<endl;文件<<“N”;对于(i=0;i<numberOfNodes;i++){文件<<i<<“”;}文件<<endl;文件<<“L”<<endl;对于(j=minPathLength;j<=maxPathLeng;j++){文件<<j<<“”;对于(i=0;i<numberOfNodes;i++){文件<<pathNodePerLength[i][j]<<“”;pathNode[i]=路径节点[i]+路径节点长度[i][j];}文件<<endl;}文件<<“总计”;对于(i=0;i<numberOfNodes;i++){文件<<pathNode[i]<<“”;}文件<<endl<<endl;文件<<“每个起始节点(SN)和结束节点(EN)对的路径数”<<endl;文件<<“SN”;对于(i=0;i<numberOfNodes;i++){文件<<i<<“”;}文件<<endl;文件<<“EN”<<endl;对于(j=0;j<节点数;j++){文件<<j<<“”;对于(i=0;i<numberOfNodes;i++){文件<<startEndNode[i][j]<<“”;}文件<<endl;}}cout<<endl<<“程序完成”<<endl;文件<<endl<<“程序完成”<<endl;完成;错误:cout<<endl<<“输入错误:程序终止”<<endl;文件<<endl<<“输入错误:程序终止”<<endl;完成:file.close();返回0;}