蛇形输出一个二维数组

定义一个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

上面的二维数组的输出顺序如下图所示:
图1

分析该数组

由于定义的二维数组是10行10列的,因此刚开始的行下标与列下标是0~9。数字由大到小排列,刚开始行数不变,列数从0开始,不断加1,直到列数为9时,列数不变,行数从1开始,不断加1,直到行数为9时,行数不变,列数从8开始,不断减1,直到列数为0时,行数又从8开始,不断减1,直到行数为1时停止。
图2

经过上面的循环,最外面的一层数就已经遍历了。

接着开始遍历倒数第二层数,由于第一次的循环把最外层的数组都遍历了,因此第二次循环的行下标与列下标就变成了1~8(第0行、第0列、第9行、第9列已经在第一次循环中遍历了)。行数不变,列数从1开始,不断加1,直到列数为8时,列数不变,行数从2开始,不断加1,直到行数为8时,行数不变,列数从7开始,不断减1,直到列数为1时,行数又从7开始,不断减1,直到行数为2时停止。
图3

以此类推下去。

-------------------------------------------------------------

由上面的分析可以看出,第一次循环二维数组的下标不管是行还是列,都是0~9;而第二次循环则变成了1–8;第三次循环就是2–7······

因此我们可以定义两个变量:

int i=0,j=9;

每循环以后就 i++ , j- - 。

在每一次循环里面又包含了四个小循环:
再定义两个变量:

int k;n=0
//k是存放每一次小循环中会不断改变的值,如第一次小循环中的列数。
//n是为了给数组赋值。

  1. 第一次列循环: 此时行数不变,列数从小到大,不断加1。
for(k=i;k<=j;k++){
	a[i][k]=++n;
}
  1. 第二次行循环: 此时列数不变,行数从小到大,不断加1。
for(k=i+1;k<=j;k++){
	a[k][j]=++n;
}
  1. 第三次列循环: 此时行数不变,列数从大到小,不断减1。
for(k=j-1;k>=i;k--){
	a[j][k]=++n;
}
  1. 第四次行循环: 此时列数不变,行数从大到小,不断减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++了。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值