您的位置:首页 > 编程语言 > C语言/C++

二维数组蛇形和Z形矩阵输出

2016-11-30 21:23 2406 查看
1、蛇形矩阵输出

思路:就顺时针的矩阵为例,由矩阵外至内圈的数值是逐渐加1的,所以主要是找出值循环增加的规律,跟设定的圈数round有关,而round的取值范围为0 <= round <= n / 2,首先定义圈数从0开始,→的下标x是恒定的,从0开始,但是下标y是从round至n - round的,接着向下↓,下标y保持n - round
不变,下标x从round + 1增加到n - round - 1,;再接着向左←,下标x保持n - round - 1不变,而下标y则由n - round - 1减到round,最后向上↑,保持下标y为round不变,再将下标x由n - round - 1减少到round + 1,一个圈结束后,round加1,继续循环,最后判断一下输入的矩阵函数是奇数还是偶数,如果是奇数就不能忘了矩阵最中间的数,最后输出的数。矩阵的各个数都已经设定好了,就以依次打印出矩阵。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int x;   /*二维数组的第一个下标*/
int y;   /*二维数组的第二个下标*/
int n;   /*创建的矩阵为n*n*/
int count = 1;  /*蛇形矩阵由1开始计数*/
int round;     /*矩阵转的圈数*/

printf("Please input the size of the array you want to be(n * n):\n");
scanf("%d",&n);
int (*a)
= calloc(n * n,sizeof(int));

//如果n = 1,则直接输出
if(n == 1)
{
a[0][0] = count;
}
else
{
for(round = 0;round <= n / 2;round++)
{
x = round;
for(y = round;y < n - round;y++)
{
a[x][y] = count;
count++;
}

y = n - round - 1;
for(x = round + 1;x < n - round - 1;x++)
{
a[x][y] = count;
count++;
}

x = n - round - 1;
for(y = n - round - 1;y >= round;y--)
{
a[x][y] = count;
count++;
}

y = round;
for(x = n - round - 2;x > round;x--)
{
a[x][y] = count;
count++;
}
}

if(n % 2 == 1)
{
a[n / 2][n / 2] = count;
}
}

for(x = 0;x< n;x++)
{
for(y = 0;y < n;y++)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
printf("\n");

return 0;
}

调试结果:

Please input the size of the array you want to be(n * n):
5
1  2  3  4  5
16 17 18 19  6
15 24 27 20  7
14 23 22 21  8
13 12 11 10  9


逆时针打印:
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n;
int x;
int y;
int round;
int count = 1;

printf("Please input the size of array:\n");
scanf("%d",&n);

int (*a)
= calloc(n * n,sizeof(int));

if(n == 1)
{
a[0][0] = count;
}
else
{
for(round = 0;round < n / 2;round++)
{
y = round;
for(x = round;x < n - 1 - round;x++)
{
a[x][y] = count;
count++;
}

x = n - 1 - round;
for(y = round;y < n - 1 -round;y++)
{
a[x][y] = count;
count++;
}

y = n - 1 - round;
for(x = n - 1 - round;x > round;x--)
{
a[x][y] = count;
count++;
}

x = round;
for(y = n - 1 - round;y > round;y--)
{
a[x][y] = count;
count++;
}
}

if(n % 2 == 1)
{
a[n / 2][n / 2] = count;
}
}

for(x = 0;x < n;x++)
{
for(y = 0;y < n;y++)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
printf("\n");

free(a);
return 0;
}


调试结果:

Please input the size of array:
5
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5  6  7  8  9


2、Z型蛇形输出矩阵

思路:首先根据要输出的矩阵的大小决定一次增加的数组值的最大个数num即n和循环的次数round(2 * n - 1),一次循环定义的二维数组值的下标x和y的和为round - 1,一直都是斜向上增加。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int x;
int y;
int n;
int num;
int round;
int count = 1;

printf("Please input the size of the array:\n");
scanf("%d",&n);

int (*a)
= calloc(n * n,sizeof(int));

if(1 == n)
{
a[0][0] = count;
}
else
{
for(round = 1;round <= n;round++)
{
for(y = 0;y < round;y++)
{
a[round - 1 - y][y] = count;
count++;
}
}

for(;round <= 2 * n - 1;round++)
{
for(y = round - n;y < n;y++)
{
a[round - 1 - y][y] = count;
count++;
}
}
}

for(x = 0;x < n;x++)
{
for(y = 0;y < n;y++)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
printf("\n");

free(a);
return 0;
}

调试结果:

Please input the size of the array:
7
1  3  6 10 15 21 28
2  5  9 14 20 27 34
4  8 13 19 26 33 39
7 12 18 25 32 38 43
11 17 24 31 37 42 46
16 23 30 36 41 45 48
22 29 35 40 44 47 49
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息