题目
题目描述
回形数是一个矩阵输出,从矩阵的左上角往右开始打印数字0,遇到矩阵边界时,顺时针90方向继续打印,并数字增长1,如此类推直到把矩阵填满,输入一个整形宽和高单位,每输出一个数字,占用1单位宽高空间,根据入参打印出对应的回形数。
输入描述:
矩阵的宽高
输出描述:
回字形的矩阵
示例1
输入:8 3
输出:
00000000
34444441
22222221
分析
类似顺时针打印矩阵的思想。
还是利用“剥圈”法
- 四个点确定一个圈:startRow,startColum,endRow,endColumn
- 对于一个圈,按照“右下左上”的顺序向矩阵中添加数,换方向后,添加的数要加一
- 每个圈,要添加的数有个初始值,比如第一个圈的初始值是0
- 添加完一个圈之后,要重新定位四个点的值,继续添加下一个圈
代码
import java.util.Scanner;
public class Main{
public static int value;//设置初始值
public static int[][] getMatrix(int row, int column){
int[][] matrix = new int[row][column];
if(row==0 || column==0){
return matrix;
}
value = 0; //设置value的初始值为0
int startRow = 0;
int startColumn = 0;
int endRow = row-1;
int endColumn = column-1;
while(startRow<=endRow && startColumn<=endColumn){
value = getMatrixByEdge(matrix, value, startRow++, startColumn++, endRow--, endColumn--);
//先调用getMatrixByEdge()函数,该函数向matrix中填值,并返回新的value,再更新四个点的值
}
return matrix;
}
public static int getMatrixByEdge(int[][] matrix, int value, int startRow, int startColumn, int endRow, int endColumn){
//先判断边界值
if(startRow == endRow){ //只有一行
for(int i=startColumn; i<=endColumn; i++){
matrix[startRow][i] = value;
}
}else if(startColumn == endColumn){ //只有一列
for(int j=startRow; j<=endRow; j++){
matrix[j][startColumn] = value;
}
}else{
//按“右下左上”的顺序,向matrix添加值
int curRow = startRow; //设置当前行指针
int curColumn = startColumn;//设置当前列指针
while(curColumn <= endColumn){ //向右
matrix[curRow][curColumn] = value;
curColumn++;
}
curColumn--; //把列指针恢复到指向最后一列
curRow++;
value++; //每处理完一个方向,value的值要加一
while(curRow <= endRow){//向下
matrix[curRow][curColumn] = value;
curRow++;
}
curRow--; //把行指针恢复到指向最后一行
curColumn--;
value++;
while(curColumn >= startColumn){//向左
matrix[curRow][curColumn] = value;
curColumn--;
}
curColumn++; //当前列指针恢复到指向第一列
curRow--;
value++;
while(curRow > startRow){//向上,且不添加第一行了
matrix[curRow][curColumn] = value;
curRow--;
}
value++;
}
return value;
}
//测试
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int column = sc.nextInt();
int row = sc.nextInt();
int matrix[][] = getMatrix(row, column);
for(int i=0; i<row; i++){
for(int j=0; j<column; j++){
System.out.print(matrix[i][j]);
}
System.out.print('\n');
}
sc.close();
}
}