题目描述:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
思路:本题即为剑指offer中29题顺时针打印矩阵的问题。需要解决的问题的有两个,一个是环状打印要循环多少次,第二是如何进行环状打印。
1.首先,每一轮开始的坐标x,y都相同,开始为0,后续每轮加一。我们发现循环打印的条件是columns>startX2&&rows>startY2.
2.打印可能有四步,向右,向下,向左,向上。但并不是每次都如此,因此我们要分析具体条件。(1)第一步向右总是需要的(2)当终止行号大于起始行号,也就是至少要两行,才有第二步向下。(3)至少有两行之后,还要至少两列才有第三步向左。(4)有两列的情况下,当至少有三行才有第四步向上。
public class HuiXing {
public static void printMatrixClockWisely(int[][] num,int columns,int rows){
if (num==null||columns<=0||rows<=0)
return;
//start为每次开始的横纵坐标
int start = 0;
while (columns>2*start&&rows>2*start){
PrintMatrixInCircle(num,columns,rows,start);
start++;
}
}
public static void PrintMatrixInCircle(int[][] num,int columns,int rows,int start){
int EndX = columns-1-start;
int EndY = rows-1-start;
for (int i = start; i <=EndX ; i++) {
System.out.println(num[start][i]);
}
if (start<EndY)
{
for (int i = start+1; i <=EndY ; i++) {
System.out.println(num[i][EndX]);
}
}
if (start<EndX&&start<EndY){
for (int i = EndX-1; i >=start ; i--) {
System.out.println(num[EndY][i]);
}
}
if (start<EndY-1&&start<EndX)
for (int i = EndY-1; i >start ; i--) {
System.out.println(num[i][start]);
}
}
}
本文详细解析了矩阵回形取数算法,即沿矩阵边缘顺时针方向取出所有元素的方法。文章介绍了算法的基本思路,包括确定环状打印的次数和如何进行环状打印,适用于解决剑指offer中29题顺时针打印矩阵的问题。
&spm=1001.2101.3001.5002&articleId=105522238&d=1&t=3&u=d22217f9ca7d439f83b825355df1a5e1)
1788

被折叠的 条评论
为什么被折叠?



