/*
* 顺时针打印
* 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--;
}
}
}
}