填充第一个数 { if (fill(Lad, position, hold, i, TF)==0) { break; //第一个数填充失败,所有依次填1,2,--n的拉丁方阵均已找到,循环结束 } i++; //自增1,准备填充第二个数 TF=true; //准备填充第二个数 continue; //开始新一轮循环 } else { if (fill(Lad, position, hold, i, TF)==0) //第i个数填充失败 { i--; TF=false; //回溯至上一个数 continue; } else { if (i!=N) //第i个数填充成功,但所有数没有填完 { i++; TF=true; //准备填充下一个数 continue; } else //所有数填充成功,找到一个拉丁方阵 { psnew=(B1 *) malloc(sizeof(B1)); psnew->next=NULL; psnew->Pa=(int **) malloc(N*sizeof(int *)); //建立B1类型节点,令节点的Pa,Pb指向该拉丁方阵和对应的占位矩阵 psnew->Pb=(int **) malloc(N*sizeof(int *));
for (j=0; j<N; j++) { psnew->Pa[j]=(int *) malloc(N*sizeof(int)); psnew->Pb[j]=(int *) malloc(N*sizeof(int));
for (k=0; k<N; k++) { *(psnew->Pa[j]+k)=Lad[j][k]; //用找到的拉丁方阵和占位矩阵填充Pa,Pb指向的拉丁方阵和占位矩阵 *(psnew->Pb[j]+k)=position[j][k]; } }
tail->next=psnew; &nb |