基础概念公式推到可参考该专栏下的前几篇博文。
经向破斜组织图:
左半部分:,3上2下1上2下,右斜,飞数为+1
右半部分:,2上1下2上3下。左斜,飞数为-1
左右两部分,经纬纱组织点运动规律和飞数均发生变化。
一、求解组织循环数,即二维数组的行数和列数
行数的话,只需要将获取组织的一般形式的分子分母依次求和即可,即纬纱循环数N1=Σ(ci+di),i∈[1,m]
。
通过观察经破斜组织图发现,左右两部分是完全对称的,总列数为偶数。
行数的话,还是以山峰Kj为中心,N2 = 2 × Kj
。
二、求第一列的元素值
,其中i=1,2,3…,N1。
三、左半部分——从第二列到Kj列,其飞数一直保持不变,可根据求规则组织的方法求解[2,Kj]列
,其中i=1,2,3...,N1;j=2,3,...,Kj
四、右半部分——Kj列和Kj + 1列经纬组织点完全相反。求解右半部分第一列元素值,即Kj + 1的值
得到左半部分的最后一列,即Kj列,通过与Kj列经纬组织点完全相反的特性,求得Kj + 1列,该列为右半部分的第一列。
计算Kj + 1列的元素:,其中i=1,2,3,…,N1。
五、右半部分——求解Kj + 2到N2列,其飞数也一直保持不变,但未原来飞数的负数,也可根据求规则组织的方法求解
,其中i=1,2,3...,N1;j=Kj + 2,...,N2
代码实现;
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,f,m,kj;int c[10],d[10],a[100][100];printf("please input m:");scanf("%d",&m);for(i=0;i<=m-1;i++){printf("please input C[%d]:",i+1);scanf("%d",&c[i]);printf("please input D[%d]:",i+1);scanf("%d",&d[i]);}printf("please input kj:");scanf("%d",&kj);N1=0;//行数初始化,即纬纱循环数初始化,之后需要累加for(i=0;i<=m-1;i++){N1=N1+c[i]+d[i];}N2=2*kj;//总列数printf("please input f:");scanf("%d",&f);if(f<0)f=N1+f;//若飞数为负数,通过公式转换成正数
/*
对第1列进行赋值
*/i=1;for(j=0;j<=m-1;j++){while(c[j]>0){a[N1-i+1][1]=1;//因为是分子,所有值都赋值为1c[j]--;i++;}while(d[j]>0){a[N1-i+1][1]=0;//因为是分母,所有值都赋值为0d[j]--;i++;}}/*
对2到kj列 进行赋值
*/for(j=2;j<=kj;j++){for(i=1;i<=N1;i++){if((i+f)>N1) a[i][j] = a[i+f-N1][j-1];else a[i][j]=a[i+f][j-1];}}/*
Kj + 1列赋值
*/for(i=1;i<=N1;i++){if(a[i][kj]==0)a[i][kj+1]=1;elsea[i][kj+1]=0;}f=N1-f;//保证飞数为正数
/*
Kj + 2到N2列赋值
*/for(j=kj+2;j<=N2;j++){for(i=1;i<=N1;i++){if((i+f)>N1) a[i][j] = a[i+f-N1][j-1];else a[i][j]=a[i+f][j-1];}}/*
输出二维数组a[i][j]
*/for(i=1;i<=N1;i++){for(j=1;j<=N2;j++){printf("%5d",a[i][j]);}printf("\n");}getchar();return 0;
}
效果图如下: