回形取数(矩阵)Java 举一反三
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出:
蓝桥杯输出的是:
1 4 7 8 9 6 3 2 5
我这里输出的是(举一反三哦):
1 2 3 6 9 8 7 4 5
思路:都在代码注释里
代码:
import java.util.Scanner;
public class 矩阵的回形打印
{
/**
* @param args
*/
public static void main(String[] args) {
// 回形打印
/*
* 例:
* 1 2 3
* 4 5 6
* 7 8 9
*/
/*输出:
* 1 2 3 6 9 8 7 4 5*/
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// 用户输入的行
int m = sc.nextInt();// 用户输入的列
int[][] arr = new int[n][m];
for (int i = 0; i < arr.length; i++)
{
for (int j = 0; j < arr.length; j++)
{
arr[i][j] = sc.nextInt();
}
}
// 1对应的二维数组的表示arr[0][0],2对应的二维数组的表示arr[0][1]...
// 3对应的是arr[0][2],6对应是arr[1][2]
int LeftUpRow = 0;// 定义起点第一行下标
int LeftUpCol = 0;// 定义起点第一列下标
int RightDownRow = arr.length - 1;// 定义终点行坐标
int RightDownCol = arr.length - 1;// 定义终点列坐标
// 打印上边横排
while ((LeftUpRow <= RightDownRow) && (LeftUpCol <= RightDownCol))
{
int r = LeftUpRow, c = LeftUpCol;
while (c <= RightDownCol)
{
System.out.print(arr[r][c] + " ");
c++;
}
c--;// 防止下标越界
r++;// 防止右上角元素被重复打印
// 打印右边竖排
while (r <= RightDownRow)
{
System.out.print(arr[r][c] + " ");
r++;
}
r--;// 防止下标越界
c--;// 防止右下角元素被重复打印
// 打印底下横排
while (c >= LeftUpCol)
{
System.out.print(arr[r][c] + " ");
c--;
}
c++;// 防止下标越界
r--;// 防止左下角元素被重复打印
// 打印左侧竖排
while (r > LeftUpRow)
{// 这里不需要等于,防止第一个元素被重复打印
System.out.print(arr[r][c] + " ");
r--;
}
// 执行完一圈r=0,c=0
LeftUpRow++;
LeftUpCol++;
RightDownCol--;
RightDownRow--;
// System.out.println(r + " " + c);
}
}
}