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++){
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++] + " ");
}
}
*各成员说明。
*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>
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);
}
} }}