20. 顺时针打印矩阵
2015-08-20 16:49
471 查看
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解析
打印第一圈的左上角坐标是(0,0),第二圈的的左上角坐标是(1,1),所以,每一圈的左上角坐标选定为(start,start). 打印圈的循环继续条件是columns>startX*2 && rows>startY*2.打印一圈分成四步:
1. 从左到右打印一行:总是需要
2. 从上到下打印一列:至少有2行
3. 从右到左打印一行:至少有2行2列
4. 从下到上打印一列:至少有3行2列
注意:每一步打印的前提条件!
实现
void PrintMatrixClockwisely(int** numbers, int columns, int rows){ if (numbers == NULL || columns <= 0 || rows <= 0) return; for (int start = 0; start * 2 < rows && start * 2 < columns; start++){ PrintMatrixInCircle(numbers, columns, rows, start); } } void PrintMatrixInCircle(int** numbers, int columns, int rows, int start){ int endX = columns - 1 - start; int endY = rows - 1 - start; //从左到右打印一行:总是要打印 for (int i = start; i <= endX; i++){ int number = numbers[start][i]; printNumber(number); } //从上到下打印一列:至少有两行 if (start < endY){ for (int i = start + 1; i <= endY; i++){ printNumber(numbers[i][endX]); } } //从右到左打印一行:至少有两行两列 if (start < endY && start < endX){ for (int i = endX - 1; i >= start; i--){ printNumber(numbers[endY][i]); } } //从下到上打印一列:至少有三行两列 if (start < endY - 1 && start < endX){ for (int i = endY - 1; i > start; i--){ printNumber(numbers[i][start]); } } } void printNumber(int number) { printf("%d\t", number); }
二维数值构建
int** numbers = new int*[rows]; for(int i = 0; i < rows; ++i) { numbers[i] = new int[columns]; for(int j = 0; j < columns; ++j) { numbers[i][j] = i * columns + j + 1; } }
相关文章推荐
- 3 Longest Substring Without Repeating Characters
- POJ 3984 迷宫问题 (BFS)
- poj1734floyd——最小欢+路径
- 利用Reveal 分析 iOS APP UI
- 请问LINUX下,怎么检查硬件损坏的情况?
- BZOJ 1467 Pku3243 clever Y EXBSGS
- JavaScript forEach 跳出当前循环
- EXCEL 不能访问
- Android Studio 快速查看方法或者变量的注释
- KVC的妙用之UIAlertController的UIAlertAction外观改变
- 与人相处的24条黄金法则
- 19. 二叉树的镜像
- java 从控制台输入密码
- Mapreducer天气排序,分区,分组,排序
- Tomcat 7服务器线程模型
- 安卓使用mapbox加载离线地图及获取位置信息
- DOM(二)-01-(示例-新闻字体)
- js获取Html元素的实际宽度高度
- PAT 1003. Emergency (25)
- Struts2(二)——配置文件struts2.xml的编写