问题描述: |
问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 输入格式 输入的第一行包含一个整数n,表示矩阵的大小。 输出格式 输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。 样例输入 4 样例输出 1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3 评测用例规模与约定 1≤n≤500,矩阵元素为不超过1000的正整数。 解题思路:主要依赖于找规律,输出方式都是沿对角线输出,方向交替。讨论好边界情况即可 |
import java.util.Scanner;
public class Main {
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//矩阵的大小
int[][] matrix=new int[n][n];//存储矩阵
for(int y=0;y<n;y++)
for(int x=0;x<n;x++)
{
matrix[y][x]=sc.nextInt();
}
int x=0,y=0;//扫描坐标
boolean flag=false;//对角线扫描方式:true为右上至左下,false为左下至右上
while(x<n&&y<n)//对角线输出
{
System.out.print(matrix[y][x]+" ");
if(x==n-1&&!flag)//到达右边界
{
y++;
if(y>n-1)
break;
System.out.print(matrix[y][x]+" ");
flag=true;
}
else if(y==n-1&&flag)//到达下边界
{
x++;
if(x>n-1)
break;
System.out.print(matrix[y][x]+" ");
flag=false;
}
else if(y==0&&!flag)//到达上边界
{
x++;
System.out.print(matrix[y][x]+" ");
flag=true;
}
else if(x==0&&flag)//到达左边界
{
y++;
System.out.print(matrix[y][x]+" ");
flag=false;
}
if(flag)//对角线扫描右上至左下
{
x--;
y++;
}
else//对角线扫描左下至右上
{
x++;
y--;
}
}
}
}