李卫康的博客

 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(ZigzagScan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:

  对于下面的4×4的矩阵,  1539  3756  9464  7313  对其进行Z字形扫描后得到长度为16的序列:  1539739547366413  请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。输入格式  输入的第一行包含一个整数n,表示矩阵的大小。  输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。输出格式  输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。样例输入41539375694647313样例输出1539739547366413评测用例规模与约定

  1≤n≤500,,矩阵元素为不超过1000的正整数。

package string_pracitice;import java.util.Scanner;public class ZScan {//定义四个变量,标示四个方向public static final int RIGHT=1;//向右public static final int DOWN=2;//向下public static final int LEFTDOWN=3;//左下public static final int RIGHTUP=4;//右上//定义一个数组int [][]data;//矩阵public static void main(String[] args) {new ZScan().run();}public void run(){//键盘输入数据Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();data=new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){data[i][j]=scanner.nextInt();}}//开始出发从(0,0)点,x为横坐标,y是纵坐标int x=0;int y=0;String result=data[y][x]+" ";System.out.print(result);//方向初始化为0int direction=0;while(!(x==n-1&&y==n-1)){//先判不从哪个方向走断if(direction==0){//为0 说明还没走第一步,下一步应该为右direction=RIGHT;}else if(direction==RIGHT){//方向为右,说明下一步为左下和右上if(x-1>=0&&y+1<n){direction=LEFTDOWN;}else{direction=RIGHTUP;}}else if(direction==DOWN){//方向向下,下一步应该为左下或者右上if(x-1>=0&&y+1<n){direction=LEFTDOWN;}else{direction=RIGHTUP;}}else if(direction==LEFTDOWN){//方向为左下,下一步为左下或者右if(x-1>=0&&y+1<n){direction=LEFTDOWN;}else if(y+1<n){direction=DOWN;}else{direction=RIGHT;}}else if(direction==RIGHTUP){if(x+1 < n && y-1 >=0){ //先判断能否继续向右上direction = RIGHTUP;}else if(x+1 < n){ //然后判断能否向右走direction = RIGHT;}else{//最后只能向下走了direction = DOWN;}}switch(direction){case RIGHT:x=x+1;break;case DOWN:y=y+1;break;case LEFTDOWN:x=x-1;y=y+1;break;case RIGHTUP:x=x+1;y=y-1;break;}result=data[y][x]+" ";System.out.print(result);}}}

这一次是一个告别,或者一个永远的告别,

李卫康的博客

相关文章:

你感兴趣的文章:

标签云: