基礎概念公式推到可參考該專欄下的前幾篇博文。
菱形斜紋組織圖:

分析:首先3上2下2上1下,飛數為+1,右斜。kw=8表示從左下角開始往上數8格為緯峰所在位置;kj=8表示從左上角開始往右數8格為經峰所在位置。
這樣就將菱形斜紋組織圖通過kw和kj分割為四部分,很明顯,Ⅰ、Ⅱ部分也就是經山形組織;
一、先求第一部分(也就是規則組織求法)
1,3上2下2上1下,fw=8,fj=8,確定矩陣的大小
2,通過規則組織求法,求出第一部分
詳細解法步驟內容可參考此處
實現步驟:
1,對第一列賦值
2,對第2列到第kj列賦值,需要注意,這里通過(i+f)>N1判斷越界,通過a[i][j] = a[i+f-kw][j-1]越界賦值
核心代碼如下:
/*
對第一部分的第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=kw-1;i<=N1;i++){if((i+f)>N1) a[i][j] = a[i+f-kw][j-1];else a[i][j]=a[i+f][j-1];}}/*
效果圖如下:
二、求第二部分(第二部分與第一部分關于第kj根經紗完全對稱
關系)
1,Ⅱ區中的任何一列都可以從Ⅰ區中對應
例如:a[14][3]==a[14][13]、a[13][4]=a[13][12]
通過推導可得公式:
2,再分別對第kj+1列到第N2列進行對稱式賦值
核心代碼如下:
/*
對第二部分(kj+1列到N2列)進行賦值
*/for(j=kj+1;j<=N2;j++){for(i=N1;i>=N1-kw+1;i--){a[i][j]=a[i][2*kj-j];}}
效果圖如下:
三、根據第一、第二部分與第三、第四部分對稱關系,求第三部分和第四部分
觀察可知,第三部分和第四部分是關于kw與第一部分和第二部分對稱
核心代碼如下:
/*
對第三部分和第四部分進行賦值
*/for(i=1;i<=N1-kw;i++){for(j=1;j<=N2;j++){a[i][j]=a[2*(N1-kw+1)-i][j];}}
效果圖如下:
代碼如下:
該代碼僅適用于Kw==N1情況
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,f,m,kj,kw;//kj表示山峰的位置,從而確定出總列數N2int c[10],d[10],a[100][100]={0};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);//輸入山峰位置,從而確定出總列數printf("please input kw:");scanf("%d",&kw);//輸入山峰位置,從而確定出總列數N1=2*kw-2;N2=2*kj-2;printf("please input f:");scanf("%d",&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=kw-1;i<=N1;i++){if((i+f)>N1) a[i][j] = a[i+f-kw][j-1];else a[i][j]=a[i+f][j-1];}}/*
對第二部分(kj+1列到N2列)進行賦值
*/for(j=kj+1;j<=N2;j++){for(i=N1;i>=N1-kw+1;i--){a[i][j]=a[i][2*kj-j];}}/*
對第三部分和第四部分進行賦值
*/for(i=1;i<=N1-kw;i++){for(j=1;j<=N2;j++){a[i][j]=a[2*(N1-kw+1)-i][j];}}/*
輸出二維數組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;
}
最終運行效果如下:
補充:實際上菱形斜紋組織的Kw并不一定都等于組織循環數,至于大于或者小于組織循環數的按照Kw進行忽略不顯示。
例如:3上2下2上1下,右斜,飛數為1,Kw=5,Kj=5
此時組織循環數為3+2+2+1=8,小于Kw,如何處理?
實際上,當Kw小于組織循環數時,超過Kw的組織會被忽略但是不會消失,遇到頂部時仍會從下上來。
灰色部分表示超過Kw的部分,會被忽略但是不會消失。
如上圖部分為第一部分,其余部分都可以根據對稱來進行求解,主要就是第一部分元素的確定
如何確定呢?
我的思路為:
主要就是第一部分的求解很重要,但是他會忽略超過Kw的區域,于是我想到了通過兩個二維數組進行求解,首先第一個二維數組專門用于求解第一部分的數值,直接通過輸入的組織循環數和飛數來獲取規則組織。
然后通過第二個二維數組截取通過Kw和Kj所確定出的第一部分的元素,之后第二個二維數組就存有第一部分的元素了,再通過對稱的方法求解出第二第三第四部分的元素即可。
優化后的代碼如下:
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,n1,n2,f,m,kj,kw;int c[10],d[10],a[100][100]={0},b[100][100]={0};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);//輸入山峰位置printf("please input kw:");scanf("%d",&kw);//輸入山峰位置n1=2*kw-2;//n1和n2才是最終的二維數組大小n2=2*kj-2;N1=0;for(i=0;i<=m-1;i++){N1=N1+c[i]+d[i];}N2=N1;printf("please input f:");scanf("%d",&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到N1列 進行賦值
*/for(j=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];}}
/*
對第一部分結果的有效部分賦給數組b
*/for(i=0;i<kw;i++){for(j=0;j<kj;j++){b[kw-1+i][1+j]=a[N1-kw+1+i][1+j];}}//對第二部分(kj+1列到N2列)進行賦值for(j=kj+1;j<=n2;j++){for(i=n1;i>=n1-kw+1;i--){b[i][j]=b[i][2*kj-j];}}//對第三部分和第四部分進行賦值for(i=1;i<=n1-kw;i++){for(j=1;j<=n2;j++){b[i][j]=b[2*(n1-kw+1)-i][j];}}/*
輸出二維數組b[i][j]
*/for(i=1;i<=n1;i++){for(j=1;j<=n2;j++){printf("%5d",b[i][j]);}printf("\n");}getchar();return 0;
}
運行效果如下: