输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字

/*
 * 顺时针打印
 * 1  2  3  4
 * 5  6  7  8
 * 9  10 11 12
 * 13 14 15 16
 * --->1 2 3 48 12 16 15 14 13 9 5 6 7 11 10
 */
import java.util.ArrayList;

public class Solution {
	public static void main(String[] args) {
		int[][] a= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
		ArrayList<Integer> arr=printMatrix(a);
		for(int i=0;i<arr.size();i++) {
			System.out.print(arr.get(i)+" ");
		}
	}
	public static ArrayList<Integer> printMatrix(int [][] matrix) {
		int hlen=matrix.length;//行数
		int llen=matrix[0].length;//列数

	    boolean[][] flag=new boolean[hlen][llen];//标志位
		
		ArrayList<Integer> val=new ArrayList<Integer>();
	    
		int i=0,j=0;//i是竖着————行标,j是横着-——列标
		while((j+1<llen &&!flag[i][j+1])||(i>0&&!flag[i-1][j])||(i+1<hlen&&!flag[i+1][j])||(j>0&&!flag[i][j-1])) {
			//四个方向至少有一条是通的
			flag[i][j]=true;
			val.add(matrix[i][j]);
			if((j+1<llen &&!flag[i][j+1])&&(i==0||flag[i-1][j])) {
				//右通,上不通,j+1
				System.out.println(matrix[i][j]+"右通");
				j++;
				continue;
			}
			if((i>0&&!flag[i-1][j])&&(j==0||flag[i][j-1])) {
				//上通,左不通,i-1
				System.out.println(matrix[i][j]+"上通");
				i--;
				continue;
			}
			if((i+1<hlen&&!flag[i+1][j])&&(j+1==llen||flag[i][j+1])) {
				//下通,右不通,i+1
				System.out.println(matrix[i][j]+"下通");
				i++;
				continue;
			}
			if((j>0&&!flag[i][j-1])&&(i==hlen-1||flag[i+1][j])) {
				//左通,下不通,j-1
				System.out.println(matrix[i][j]+"左通");
				j--;
				continue;
			}
		}
		val.add(matrix[i][j]);
		return val; 
	}	           
}

 

 

 

左神算法中的解决思路:

思想:一层一层处理

 

一层完后,有外层的左上点,到内层的左上点,进行下一层的处理

import java.util.ArrayList;

public class ZuoSolu {
	public static void main(String[] args) {
		int[][] a= {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
		printMatrix(a);
	}
	
	public static void printMatrix(int[][] matrix){
		int m=matrix.length;
		int n=matrix[0].length;
		for(int i=0,j=0;(i<=m/2)&&(j<=n/2);i++,j++) {
			printEdge(matrix,i,m-i-1,j,n-j-1);			
		}
		
	}
	
	public static void printEdge(int[][] arr,int hs,int he,int ls,int le) {
		if(hs==he) {
			//一行
			int i=ls;
			while(i<=le) {
				System.out.print(arr[hs][i]+" ");
				i++;
			}
		}
		else if(ls==le) {
			//一列
			int i=hs;
			while(i<=he) {
				System.out.print(arr[i][ls]+" ");
				i++;
			}
		}
		
		//矩形
		//打印上
		else{
			int i=ls;
			while(i<le) {
				System.out.print(arr[hs][i]+" ");
				i++;
			}
			//打印右
			i=hs;
			while(i<he) {
				System.out.print(arr[i][le]+" ");
				i++;
			}
			//打印下
			i=le;
			while(i>ls) {
				System.out.print(arr[he][i]+" ");
				i--;
			}
			//打印右
			i=he;
			while(i>hs) {
				System.out.print(arr[i][ls]+" ");
				i--;
			}
		}
	}	
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值