各种螺旋矩阵
2013-04-17 18:33
393 查看
螺旋矩阵
无聊,不知道干点什么,今天就写个关于螺旋矩阵的问题吧,开始的三个螺旋矩阵采用的是同一种方法,后面会有新方法!
由外向内的螺旋矩阵
先来看看普通的螺旋矩阵,由外面向里面螺旋的 如下:
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
这样的N阶特殊矩阵,处理起来是最好处理的,4个循环分别给4面赋值,然后依次向内跳转就可以了,编写方法很多,我这里随便写了个:
看起来好像很好看的样子
由内向外的螺旋矩阵
一般对于螺旋矩阵,我处理的方法都喜欢在末尾把最特殊的单独看待,不想再程序中加很多处理代码来兼容特殊情况,
由内向外的螺旋矩阵如图所示:
如果要以这种方式的话,请确保矩阵的边数是奇数!( 奇数会写了偶数也就同样道理了) 我的处理方式依旧还是,最中间那个首先搞为1,然后外层的依次4个循环,废话不多说,程序如下:
运行结果如下:
方法很多,这种方法只是追求实现而已,可能程序简洁性不太好!!
上三角螺旋矩阵(蓝桥杯题目)
上三角螺旋矩阵,样例如下:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
其实在上面两个螺旋矩阵里面我们都采用的是逐个赋值的方法,利用循环来控制赋值的方向,在这里我们姑且也先用这种方法!因为我觉得这个直观一点,但是他不是最简单的。这个我们稍后再说!由于C++中不支持那种锯齿数组,我们这里姑且用二维数组来表示!!
程序如下:
运行结果,测试用例Num为19:
无聊,不知道干点什么,今天就写个关于螺旋矩阵的问题吧,开始的三个螺旋矩阵采用的是同一种方法,后面会有新方法!
由外向内的螺旋矩阵
先来看看普通的螺旋矩阵,由外面向里面螺旋的 如下:
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
这样的N阶特殊矩阵,处理起来是最好处理的,4个循环分别给4面赋值,然后依次向内跳转就可以了,编写方法很多,我这里随便写了个:
int main() { int num; scanf("%d",&num); int **array = (int **)malloc(sizeof(int *) * num); //动态创建C语言的二维数组代码 for(int i=0;i<num;++i) array[i] = (int *)malloc(sizeof(int)*num); int K=1,j,n=0; while(true) //主要的赋值过程 { i = j = n++; if( i > (num-1)/2 ) break; for(;j<num-n;j++) array[i][j] = K++; for(;i<num-n;i++) array[i][j] = K++; for(;j>n-1;j--) array[i][j] = K++; for(;i>n-1;i--) array[i][j] = K++; } if( num%2 != 0) //这个算法在最后一圈是一个元素(即中心)的时候没赋值,所以手动处理最后一个特殊位置 array[num/2][num/2] = num*num; for(i=0;i<num;i++) { for(j=0;j<num;j++) printf("%4d",array[i][j]); printf("\n"); } system("pause"); return 0; }
看起来好像很好看的样子
由内向外的螺旋矩阵
一般对于螺旋矩阵,我处理的方法都喜欢在末尾把最特殊的单独看待,不想再程序中加很多处理代码来兼容特殊情况,
由内向外的螺旋矩阵如图所示:
如果要以这种方式的话,请确保矩阵的边数是奇数!( 奇数会写了偶数也就同样道理了) 我的处理方式依旧还是,最中间那个首先搞为1,然后外层的依次4个循环,废话不多说,程序如下:
#include <stdio.h> #include <stdlib.h> int main() { int num; scanf("%d",&num); if(num % 2 == 0) exit(0); int **array = (int **)malloc(sizeof(int *) * num); for(int i=0;i<num;++i) array[i] = (int *)malloc(sizeof(int)*num); int x = num/2,y = num/2; int n = 0; //控制循环往外的变量 int N = 1; i = x; int j = y+1; //N赋值的变量 array[x][y] = N++; while(true) { n++; if(n+x>num-1) break; for(;i<=x+n;i++) array[i][j] = N++; i--; j--; for(;j>=y-n;j--) array[i][j] = N++; j++; i--; for(;i>=x-n;i--) array[i][j] = N++; i++; j++; for(;j<=y+n;j++) array[i][j] = N++; } for(i=0;i<num;i++) { for(j=0;j<num;j++) printf("%4d",array[i][j]); printf("\n"); } system("pause"); return 0; }
运行结果如下:
方法很多,这种方法只是追求实现而已,可能程序简洁性不太好!!
上三角螺旋矩阵(蓝桥杯题目)
上三角螺旋矩阵,样例如下:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
其实在上面两个螺旋矩阵里面我们都采用的是逐个赋值的方法,利用循环来控制赋值的方向,在这里我们姑且也先用这种方法!因为我觉得这个直观一点,但是他不是最简单的。这个我们稍后再说!由于C++中不支持那种锯齿数组,我们这里姑且用二维数组来表示!!
程序如下:
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int Num; scanf("%d",&Num); int **array = new int* [Num]; for(int i=0; i<Num ; ++i) array[i] = new int [Num]; i=0; int N = 0,j=0,n=0; while(true) //同上面一样,主循环赋值 { if(n > Num/2-1) break; for(;j<Num-1-2*n;j++) array[i][j] = N++; for(;i!=Num-1-2*n && j!=n;i++,j--) array[i][j] = N++; for(;i>n;i--) array[i][j] = N++; i++; j++; n++; } if(Num%3 == 1) array[Num/3][Num/3] = N; //这里是处理特殊情况,也就是最中间一层只有一个元素时,单独赋值,已经证明在4,7,10时最中间只有一个元素 for(i=0;i<Num;i++) { for(j=0;j<Num-i;j++) printf("%4d",array[i][j]); printf("\n"); } system("pause"); return 0; }
运行结果,测试用例Num为19:
相关文章推荐
- 螺旋矩阵
- 矩阵螺旋输出打印原代码
- 螺旋矩阵
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 54.螺旋矩阵(Spiral Matrix)
- Leet Code 59 Spiral Matrix II - 螺旋矩阵 - Java
- C++实现:螺旋矩阵的实例代码
- Silverlight实用窍门系列:54.详解Silverlight中的矩阵变换MatrixTransform,实现其余各种变换
- 脑洞脑洞 螺旋矩阵
- [PAT乙级]1050. 螺旋矩阵(25)
- 矩阵的螺旋排列 Python实现
- 外螺旋矩阵排列
- PHP实现螺旋矩阵(螺旋数组)
- PAT : 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 蛇形螺旋矩阵的生成和遍历 Spiral Matrix
- 螺旋矩阵
- [LintCode]381.螺旋矩阵 II
- 打印螺旋数字矩阵