对一维顺序数组螺旋输出到二维数组
2009-10-10 22:56
423 查看
对一维顺序数组进行螺旋输出(不是顺序的话就先进行排序),如
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
主要思想:对用拥有X*Y个元素的数组分为Y行输出,每行X个数。
将螺旋输出的结果看做一个坐标系,将输出看做很多个不同大小的“口”,注意到一个规律:
输出“口”的上部分时,Y坐标不变,X坐标递增;输出右部分时,X坐标不变,Y坐标递增;以此类推...
可见输出一个“口”便是一个循环,那么就可以用这个循环来输出整个数组。
方法:定义四个变量记录“口”形的大小,xmax=X-1,ymax=Y-1,xmin=0,ymin=0,他们分别表示每个“口”的
最大x、y值和最小x、y值。
现在,控制了“口”行的大小以及位置,接下来不停的将原一维数组输出到一个二维数组就可以了。再将
二维数组顺序列出就得到最终的螺旋输出了。
如果是将这样一个二维数组输出到一维数组的话,根据这种思路,就变得更简单了。只需将
a[j][i++] = b[q++]; 改为 b[q++]= a[j][i++]; ,
void Output(int (*a)[X],int b[]) 改为void Output(int (*a)[X],int *b)
即可。
感觉这个方法比较笨拙,不知道有没有公式能直接计算出元素的位置,这样效率也许会快一点
Code
1
2 #include<stdio.h>
3 #define X 11 //定义列数,改变这两行得到不同输出
4 #define Y 12 //定义行数
5
6 void Output(int (*a)[X],int b[])
7 { int xmax=X-1,ymax=Y-1;
8 int xmin=0,ymin=0;
9 int i,j,q=0,all_n = X*Y;
10
11 while(q < all_n) //不停的顺时针循环输出“口”形到二维数组,直到数组b的最后一个元素
12 { i = xmin,j = ymin; //i为行坐标,j为纵坐标
13 //一下四个while分别输出一次循环的四边
14 while(i <= xmax && q < all_n)//这个while是输出上边的,下面的以此类推。注意边界控制
15 a[j][i++] = b[q++];
16 i = xmax;
17 j = ++ymin;
18
19 while(j <= ymax && q < all_n)
20 a[j++][i] = b[q++];
21 j = ymax;
22 i = --xmax;
23
24 while(i >= xmin && q < all_n)
25 a[j][i--] = b[q++];
26 i =xmin;
27 j = --ymax;
28
29 while(j >= ymin && q < all_n)
30 a[j--][i] = b[q++];
31 ++xmin;
32 }
33
34 }
35 void main()
36 {
37 int a[Y][X];
38 int b[Y*X];
39 int p = Y*X;
40
41 for(int k=0;k<p;k++)
42 b[k]=k+1;
43 //------------------
44 Output(a,b);
45 //------------------
46 for(int i=0;i<Y;i++)
47 { for(int j=0;j<X;j++)
48 printf("%-3d ",a[i][j]);
49 printf("\n");
50 }
51 }
52
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
主要思想:对用拥有X*Y个元素的数组分为Y行输出,每行X个数。
将螺旋输出的结果看做一个坐标系,将输出看做很多个不同大小的“口”,注意到一个规律:
输出“口”的上部分时,Y坐标不变,X坐标递增;输出右部分时,X坐标不变,Y坐标递增;以此类推...
可见输出一个“口”便是一个循环,那么就可以用这个循环来输出整个数组。
方法:定义四个变量记录“口”形的大小,xmax=X-1,ymax=Y-1,xmin=0,ymin=0,他们分别表示每个“口”的
最大x、y值和最小x、y值。
现在,控制了“口”行的大小以及位置,接下来不停的将原一维数组输出到一个二维数组就可以了。再将
二维数组顺序列出就得到最终的螺旋输出了。
如果是将这样一个二维数组输出到一维数组的话,根据这种思路,就变得更简单了。只需将
a[j][i++] = b[q++]; 改为 b[q++]= a[j][i++]; ,
void Output(int (*a)[X],int b[]) 改为void Output(int (*a)[X],int *b)
即可。
感觉这个方法比较笨拙,不知道有没有公式能直接计算出元素的位置,这样效率也许会快一点
Code
1
2 #include<stdio.h>
3 #define X 11 //定义列数,改变这两行得到不同输出
4 #define Y 12 //定义行数
5
6 void Output(int (*a)[X],int b[])
7 { int xmax=X-1,ymax=Y-1;
8 int xmin=0,ymin=0;
9 int i,j,q=0,all_n = X*Y;
10
11 while(q < all_n) //不停的顺时针循环输出“口”形到二维数组,直到数组b的最后一个元素
12 { i = xmin,j = ymin; //i为行坐标,j为纵坐标
13 //一下四个while分别输出一次循环的四边
14 while(i <= xmax && q < all_n)//这个while是输出上边的,下面的以此类推。注意边界控制
15 a[j][i++] = b[q++];
16 i = xmax;
17 j = ++ymin;
18
19 while(j <= ymax && q < all_n)
20 a[j++][i] = b[q++];
21 j = ymax;
22 i = --xmax;
23
24 while(i >= xmin && q < all_n)
25 a[j][i--] = b[q++];
26 i =xmin;
27 j = --ymax;
28
29 while(j >= ymin && q < all_n)
30 a[j--][i] = b[q++];
31 ++xmin;
32 }
33
34 }
35 void main()
36 {
37 int a[Y][X];
38 int b[Y*X];
39 int p = Y*X;
40
41 for(int k=0;k<p;k++)
42 b[k]=k+1;
43 //------------------
44 Output(a,b);
45 //------------------
46 for(int i=0;i<Y;i++)
47 { for(int j=0;j<X;j++)
48 printf("%-3d ",a[i][j]);
49 printf("\n");
50 }
51 }
52
相关文章推荐
- 一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出
- 一维数组和二维数组创建,输出,Arrays.fill()替换
- 每天一道LeetCode-----将m × n矩阵按照顺时针螺旋顺序转化成一维数组
- 一维数组的逆序输出(情况一:仅输出时发生改变,数组元素位置不发生改变、情况二:将顺序数组改为逆序数组)
- 顺时针打印二维数组(螺旋输出数组)
- 利用一维数组输出二维数组
- 如何使一维数组一行一行的输出成二维数组的格式
- JavaScript - 一维数组、二维数组基础
- Java自定义一维数组、二维数组的实例化,解决一维数组、二维数组NullPointerException异常
- C语言一维数组转换为二维数组
- php实现给二维数组中所有一维数组添加值的方法
- Java 实现顺时针螺旋二维数组输出
- 一维数组、二维数组、字符数组、指针 相关的 sizeof 计算
- JAVA菜鸟入门(9) Java打印一维数组,二维数组
- java数组学习之二:使用二维数组输出杨辉三角
- 一维数组题目训练,二维数组巩固
- 一维数组下元素添加到二维数组
- 数组指针输出二维数组
- 利用一维数组 输出杨辉三角
- C#新手入门代码 将一维string数组转换成二维char类型输出并输出