# windows **Repository Path**: liu-yan-23/windows ## Basic Information - **Project Name**: windows - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-28 - **Last Updated**: 2024-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1.首先,第一步便是找规律(以六行六列为例):不难发现: 第一轮可以看作先写第一行,为6;再写最后一列,并且为6-1,接着写倒数第一行,也为6-1,最后写第一列,为6-2; 同理:第二轮可以看作先写第二行,为6-2,再写倒数第二列,并且为6-2-1,接着写倒数第二行,也为6-2-1,最后写第二列,为6-2-2; 同样:第三轮可以看作先写第三行,为6-2-2,再写倒数第三列,并且为6-2-2-1,接着写倒数第三行,也为6-2-2-1,最后写第三列,为6-2-2-2; 一共会进行三轮,即6/2; 则当a行b列时,进行a/2(a为偶数)或a+1/2轮(a为奇数); 因此,我们写函数时也按照此顺序:(设a为行数,b为列数) 2.接下来,我们具体来看: 首先要注意,若行数为单数,也应进行其行数加一除二轮,即: ``` int c; if (a % 2 != 0) c = a + 1; else c = a; ``` 接着进行循环的第一步: ``` int m = 0; for (int i = 0; i < c / 2; i++) { for (int q = 0; q < b - (i * 2); q++) { m++; arr[i][q + i] = m; } ``` 应循环的次数为是列数-循环次数*2; 每次数组的位置为第i行(总体循环的次数),第q+i列,此时最容易忽略i,但从第二轮开始,便需要加i。 第二步: ``` if (a % 2 == 0 || i != c / 2 - 1) { for (int w = 0; w < a - 1 - (2 * i); w++) { m++; arr[w + 1 + i][b - i - 1] = m; } ``` 应循环的次数为是行数-1-循环次数*2;每次数组的位置为第w+1+i行,此时也最容易忽略i,但从第二轮开始,便需要加i,第b-i-1列。 第三步: ``` int s = 0; for (int e = b - 1 - (2 * i); e > 0; e--) { m++; arr[a - i - 1][b - i - 2 - s] = m; s++; } ``` 第三步是我认为较为复杂的一步,由于此时是逆着进行,所以是e--,因为此时数组的位置不再好表示,因此我引入了一个新的变量,来进行协助。 第四步: ``` for (int r = a - 2 * (i + 1); r > 0; r--) { m++; arr[r + i][i] = m; } ``` 第四步同理,循环次数为a-2*(i+1),也是r--,数组的位置较容易,行为r+I,列为I; 纵观全局,会发现当行数为奇数时,规律不太一样: 此时,最后一轮只需要进行刚开始行的,即可,故而又加了一个if语句 。 if (a % 2 == 0 || i != c / 2 - 1) { 在这里面,最容易出错的其实是数组具体的位置,需要耐心的找规律,注意加i; 3.最后,写出来主函数 ``` int main() { int arr[100][100] = { 0 }; int a, b, c; cin >> a >> b; array1(a,b,arr); for (int u = 0; u < a; u++) { for (int j = 0; j < b; j++) { cout << setw(3) << arr[u][j] << " "; if (j == b - 1) cout << endl; } } } ```