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

解决方案 »

  1.   

    int s1 = new int[] {
    1, 12, 11, 10, 
    2, 13, 16, 9, 
    3, 14, 15, 8, 
    4, 5,  6,  7
    }for (int i = 0; i < s1.length;) {
       for (int j = 0; j < 4; ++j) {
          System.out.print(s1[i++] + " ");
       }
    }
      

  2.   

    /**算法思想:先把方阵填满,再打印出来。填的时候,先填1,再填2,以此类推。
    *各成员说明。
    *mat 用来存放方阵。
    *dirction存放四个方向,0表示向南走,1表示向东走,2表示向北走,3表示向西走。没有用到。
    *step表示在方阵中走动时,在各个方法上走到下一步时,相对于当前位置的偏移值。
    *如stap[3]表示向西走时的偏移值,向西走时行值不变,列值要减1,所以step[3]={0,-1};
    *
    */
    public class SquareMatrix{
    private static int[][] mat;
    //private static int[] direction={0,1,2,3};
    private static int[][] step={
    { 1, 0},
    { 0, 1},
    {-1, 0},
    { 0,-1}
    };
    public static void main(String[] args){
    printSquareMatrix(5);
    }

    public static void printSquareMatrix(int x){
    getSquareMatrix(x);
    int elemLen=String.valueOf(x*x).length();
    String space="                   ";
    for(int i=0;i<x;i++){
    for(int j=0;j<x;j++){
    System.out.print(space.substring(0,elemLen-String.valueOf(mat[i][j]).length()));
    System.out.print(mat[i][j]+" ");
    }
    System.out.println("");
    }
    } public static void getSquareMatrix(int num){
    mat=new int[num][num];
    int n=1;
    int dir=0;
    int row=0,col=0;
    int nextRow,nextCol;
    while(n<=num*num){
    mat[row][col]=n;
    n++;
    nextRow=row+step[dir][0];
    nextCol=col+step[dir][1];
    /**if中的条件就是方向要做改变的条件,方向的改变是按照,0,1,2,3的顺序循环的。
    */
    if(nextRow<0||nextRow==num||nextCol<0||nextCol==num||mat[nextRow][nextCol]!=0){
    dir=(dir+1)%4;
    }
    row+=step[dir][0];
    col+=step[dir][1];
    }
    }
    }
    F:\java>javac SquareMatrix.javaF:\java>java SquareMatrix
     1 16 15 14 13
     2 17 24 23 12
     3 18 25 22 11
     4 19 20 21 10
     5  6  7  8  9F:\java>
      

  3.   

    public class LoopMatrix {    public static void main(String[] args) {
            int len = 7; //边长参数
            int sNUM = 1; //起始数字
            int sROW = 0;
            int sCOL = 0;
            int[][] result = new int[len+1][len+1];
            loop(sROW,sCOL,len,sNUM,result); //打印循环
            for(int iROW[]:result){
                for(int item:iROW){
                    System.out.print(item);
                    Integer num = item;
                    for(int space=0;space<len+1-num.toString().length();space++){
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }    }

    //递归函数
        static void loop(int row, int col, int length, int startNum, int[][] matrix){        //边长为零,即只有当前坐标需要处理
            if (length ==0){
                matrix[row][col]=startNum;
            }
            else
            {
                //边长不为零,一个循环同时处理四个边。            
                for(int i = 0; i< length;i++){
                    
                    matrix[row+i][col]=startNum + i;
                    matrix[row+length][col+i]= startNum + length +i;
                    matrix[row+length-i][col+length]=startNum + length*2 +i;
                    matrix[row][col+length-i]= startNum + length*3+i;
                }
                startNum += 4*length;
                length -= 2;
                if(length>=0){
                    loop(row+1,col+1,length,startNum,matrix);
                }
                
            }    }}