【算法竞赛练习题】三角螺旋阵
2015-11-11 21:53
375 查看
方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
程序运行时,从标准输入获得整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
代码实现
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
程序运行时,从标准输入获得整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
代码实现
#include<stdio.h> #include<malloc.h> //初始化矩阵,确定出需要螺旋化的区域 matrix——矩阵 void initMatrix(int **matrix,int n) { for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { if(j<n-i) matrix[i][j] = 0; else matrix[i][j] = -1; } } } //完成矩阵的三角螺旋 spiral——螺旋 void spiralMatrix(int **matrix,int n) { int count = 1;//填充计数器,表示向矩阵填充的数字值 int direction = 0;//代表当前填充数字时的趋向,0表示右,1表示左下,2表示上 int i,j; i = 0,j = 0;//表示将要填充的数字在矩阵中的坐标 int maxCount = (n+n*n)/2; while(count<=maxCount) { //printf("Test count=%3d i:%3d j:%3d\n",count,i,j); matrix[i][j] = count++;//改进,之前程序存在冗余片段,去掉了不必要的switch语句 if(direction == 0)//若当前填充的趋向为向右时 { if(j+1<n && matrix[i][j+1]==0) ++j; else { direction = 1;//若矩阵的一行填充完,则方向开始向左下填充 ++i,--j; } } else if(direction == 1) { if((i+1<n && j-1>=0) && matrix[i+1][j-1]==0)//错误,两个条件的前后顺序防反,应该先要保证下标没有越界,再去访问数组元素 { ++i,--j; } else { direction = 2; --i; } } else if(direction == 2) { if(matrix[i-1][j]!=0)//在这里数组下标不会越界 { direction = 0; ++j; } else --i; } } } //输出三角螺旋矩阵 void showMatrix(int **matrix,int n) { for(int i=0;i<n;++i) { for(int j=0;j<n-i;++j) { printf("%4d",matrix[i][j]); } printf("\n"); } } int main() { int n; int **matrix; scanf("%d",&n); matrix = (int **)malloc(sizeof(int *)*n); for(int i=0;i<n;++i) { matrix[i] = (int *)malloc(sizeof(int)*n); } initMatrix(matrix,n); spiralMatrix(matrix,n); showMatrix(matrix,n); return 0; }
相关文章推荐
- 解决网络丢包问题及故障判断方法
- JDK数据类型Short、Long
- 《王爽——汇编语言》P206 实验室10第三个问题的答案
- Leetcode152: Gas Station
- 10 配置的详细说明
- 02.JMS基础
- 使用libsvm工具箱,README文档要仔细阅读
- Android之android.intent.category.LAUNCHER的用途和使用
- 09 JobManager 高可用安装(HA)
- muduo库阅读(36)——Net部分:事件循环线程池EventLoopThreadPool
- Gson简要使用笔记
- 2015-11-08 第三天
- 用户管理命令
- nginx+tomcat集群高可用
- 深入理解计算机系统(3)
- ios单例传值
- Caffe的Solver参数设置
- 08 Running Flink on YARN leveraging Tez
- 07 GCloud Setup
- jquery 绑定事件累加