定义一个10*10的数组,让其蛇形输出,每行输出10个数:
1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19
上面的二维数组的输出顺序如下图所示:
分析该数组
由于定义的二维数组是10行10列的,因此刚开始的行下标与列下标是0~9。数字由大到小排列,刚开始行数不变,列数从0开始,不断加1,直到列数为9时,列数不变,行数从1开始,不断加1,直到行数为9时,行数不变,列数从8开始,不断减1,直到列数为0时,行数又从8开始,不断减1,直到行数为1时停止。
经过上面的循环,最外面的一层数就已经遍历了。
接着开始遍历倒数第二层数,由于第一次的循环把最外层的数组都遍历了,因此第二次循环的行下标与列下标就变成了1~8(第0行、第0列、第9行、第9列已经在第一次循环中遍历了)。行数不变,列数从1开始,不断加1,直到列数为8时,列数不变,行数从2开始,不断加1,直到行数为8时,行数不变,列数从7开始,不断减1,直到列数为1时,行数又从7开始,不断减1,直到行数为2时停止。
以此类推下去。
-------------------------------------------------------------
由上面的分析可以看出,第一次循环二维数组的下标不管是行还是列,都是0~9;而第二次循环则变成了1–8;第三次循环就是2–7······
因此我们可以定义两个变量:
int i=0,j=9;
每循环以后就 i++ , j- - 。
在每一次循环里面又包含了四个小循环:
再定义两个变量:
int k;n=0
//k是存放每一次小循环中会不断改变的值,如第一次小循环中的列数。
//n是为了给数组赋值。
- 第一次列循环: 此时行数不变,列数从小到大,不断加1。
for(k=i;k<=j;k++){
a[i][k]=++n;
}
- 第二次行循环: 此时列数不变,行数从小到大,不断加1。
for(k=i+1;k<=j;k++){
a[k][j]=++n;
}
- 第三次列循环: 此时行数不变,列数从大到小,不断减1。
for(k=j-1;k>=i;k--){
a[j][k]=++n;
}
- 第四次行循环: 此时列数不变,行数从大到小,不断减1。
for(k=j-1;k>i;k--){
a[k][i]=++n;
}
当上面四个小循环都循环一遍之后,整个数组的最外面一层也就遍历了,所以这四个小循环组成一个大循环,就可以把整个数组遍历了。
而大循环中的结束条件就是 i>.=j , 因为是不断增加,而 j 是不断减少的,在我定义的数组里,里面的元素个数是偶数,所以只需要 i==j 就可以结束了,但为防止以数组的元素个数是奇数,因此大循环用 i>=j 更保险。
组合后的代码:
while(i<j){
for(k=i;k<=j;k++){
a[i][k]=++n;
}//第一次列循环:此时行数不变,列数从小到大,不断加1。
for(k=i+1;k<=j;k++){
a[k][j]=++n;
}//第二次行循环:此时列数不变,行数从小到大,不断加1。
for(k=j-1;k>=i;k--){
a[j][k]=++n;
}//第三次列循环:此时行数不变,列数从大到小,不断减1。
for(k=j-1;k>i;k--){
a[k][i]=++n;
}//第四次行循环:此时列数不变,行数从大到小,不断减1。
i++;
j--;
}
最后数组都赋值后,就可以输出了,输出只需要按顺序输出就好了:
行下标作外循环,列下标作内循环 就可以输出了。
代码
#include <stdio.h>
int main()
{
int a[10][10];
int i=0,j=9,n=0,k;
while(i<j){
for(k=i;k<=j;k++){
a[i][k]=++n;
}
for(k=i+1;k<=j;k++){
a[k][j]=++n;
}
for(k=j-1;k>=i;k--){
a[j][k]=++n;
}
for(k=j-1;k>i;k--){
a[k][i]=++n;
}
i++;
j--;
}
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%6d",a[i][j]);
}
printf("\n");
}
return 0;
}
最后,把 n=0 改成 n=1;给数组赋值就可以改为 n++了。