基礎概念公式推到可參考該專欄下的前幾篇博文。
經山形組織圖:
左半部分:,3上2下1上2下,右斜,飛數為+1
右半部分:,3上2下1上2下,左斜,飛數為-1
左右兩部分只有飛數是相反數,經緯紗組織點的運動規律保持不變。
一、求解二維矩陣的行列數即經緯紗循環數N1、N2
由經山組織圖可觀察得知:左半部分為左斜,飛數為+1;右半部分為右斜,飛數為-1。
嚴格意義上來講,經山組織不屬于規則組織,但是若從中間一分為二,左右兩部分都為規則組織中的斜紋組織。
需要知道Kj,指明山峰的位置即可
行數的話,只需要將獲取組織的一般形式的分子分母依次求和即可,即緯紗循環數N1=Σ(ci+di),i∈[1,m]
。
列數的話,因為經山組織存在一個山峰,故是奇數列,其中以山峰Kj為劃分,左半部分為Kj列
(包含山峰所在列),右半部分為Kj - 2列
,故其經紗循環數N2=2 × Kj - 2
。
二、求第一列的元素值
,其中i=1,2,3…,N1。
三、左半部分——從第二列到Kj列,其飛數一直保持不變,可根據求規則組織的方法求解[2,Kj]列
,其中
i=1,2,3...,N1;j=2,3,...,Kj
四、右半部分——求解Kj+1到N2列,其飛數也一直保持不變,但未原來飛數的負數,也可根據求規則組織的方法求解
通過公式可將負飛數轉換為正數:
再跟2一樣進行求解規則組織
,其中
i=1,2,3...,N1;j=Kj + 1,...,N2
代碼實現:
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,f,m,kj;//kj表示山峰的位置,從而確定出總列數N2int 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-2;//總列數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];}}f=N1-f;//求kj列到N2列右半部分的飛數需要將負值轉變為正數/*
對kj列到N2列 進行賦值
*/for(j=kj+1;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;
}
運行效果如下: