打印蛇形矩阵

问题描述:给定一个整数矩阵,将该整数矩阵顺时针打印出来,

            例如矩阵为    1   2   3   4

                              5   6   7   8

                              9  10  11 12

                            13  14  15 16

            则顺时针输出为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10

分析:这道题其实没有涉及到复杂的算法和数据结构问题,就是代码技巧问题,没有简单的方法来做,只能画图找出每次循

         环的边界来控制,找出规律。提供两种解法,这两种解法差别不大,仅仅在于循环条件不同。

解法一: 通过画图可以看出圈开始的第一元素可以作为我们的基准元素,确定了这个元素也就好办了。可以得出规律,每次的

        基准元素位置都是上一个基准元素的位置两个下标均加上1,即可,循环的执行条件就是要求行数和列数都大于基准

        元素下标的两倍。

        具体的Java代码如下,写法比较通用,读者可以很容易转换为其他语言实现。

public class Main {
    public static void orderprint(int a[][]){
    	if(a==null){
    		System.out.println("数组不存在");
    		return ;
    	}
    	int row=a.length,column=a[0].length;
    	if(row==0 || column==0){
    		System.out.println("数组为空数组");
    		return ;
    	}
    	int startx=0,starty=0,endx,endy;
    	int i,j;
    	while(row>starty*2 && column>startx*2)
    	{   
    		endx=column-1-startx;                      //计算出每圈的列边界
    		endy=row-1-starty;                         //计算出每圈的行边界
    		for(j=startx;j<=endx;j++)                  //上部从左到右打印
    			System.out.print(a[starty][j]+",");
    	    for(i=starty+1;i<=endy;i++)                //右部从上到下打印
    	    	System.out.print(a[i][endx]+",");
    	    for(j=endx-1;j>=startx;j--)                //下部从右到左打印
    	    	System.out.print(a[endy][j]+",");
    	    for(i=endy-1;i>starty;i--)                 //左部从下到上打印
    	    	System.out.print(a[i][startx]+",");
    	    startx++;starty++;                         //改变每圈第一数的位置
    	}
    }
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
      int a[][]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
      orderprint(a);
	}

}


解法二:通过画图,我们还可以发现,矩阵其实由对角线的两个顶点就可以确定,我们可以一圈一圈来打印,每打印完一圈,

              让对角线的两个顶点分别向内收缩,当两个顶点错开的时候停止即可。具体的代码实现如下:

public class Main {  
    public static void orderprint(int a[][]){  
        if(a==null){  
            System.out.println("数组不存在");  
            return ;  
        }  
        int row=a.length,column=a[0].length;  
        if(row==0 || column==0){  
            System.out.println("数组为空数组");  
            return ;  
        }  
        int startx=0,starty=0,endx=column-1,endy=row-1; //计算出矩阵的对角线坐标 
        int i,j;  
        while(startx<=endx && starty<=endy)  
        {       
            for(j=startx;j<=endx;j++)                  //上部从左到右打印  
                System.out.print(a[starty][j]+",");  
            for(i=starty+1;i<=endy;i++)                //右部从上到下打印  
                System.out.print(a[i][endx]+",");  
            for(j=endx-1;j>=startx;j--)                //下部从右到左打印  
                System.out.print(a[endy][j]+",");  
            for(i=endy-1;i>starty;i--)                 //左部从下到上打印  
                System.out.print(a[i][startx]+",");  
            startx++;starty++;                         //左上角坐标向右下方移动
            endx--;endy--;                             //右下角坐标向左上角移动
        }  
    }  
    public static void main(String[] args) {  
        // TODO 自动生成的方法存根  
      int a[][]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};  
      orderprint(a);  
    }  
  
} 


输出结果为:

1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值