Print case
16 15 14 13
5 4 3 12
6 1 2 11
7 8 9 10
You must dynamically change the number of rows and columns.
The following two methods are provided. I personally think the idea of method 2 is clearer, because we use recursion to fill in a circle of data every time until all circles of data are filled. in addition, when you fill in a circle of data, there is no need to fill in a number in a loop. In fact, as long as you cycle the data in the first row, you can calculate the data in the last row. As long as you cycle the data in the first column, the data of the last column can be calculated, which saves half of the cycle operation.
Method 1:
/**
*
This program can change the number of rows and columns to print
Principle: assign values one by one from the largest to the smallest by locating the row number and column number.
@ Author zhangle
*/
Public static void main (string [] ARGs ){
Int ROW = 4; // several rows
Int Col = 4; // Several columns
Int [] [] M = new int [row] [col]; // a two-dimensional array for storing results
Int n = Col * row; // maximum value in the Matrix
Int I = 0; // The row number.
Int J = 1; // column number
Int t_col = Col; // column Loop Variable
Int t_row = row; // The row loop variable.
While (true ){
// Assign a value to a row
For (int K = 0; k <t_col; k ++ ){
J + =-1;
M [math. Abs (I)] [math. Abs (j)] = n --;
}
If (n = 0) break; // exit if the value has been assigned
T_col --; // column loop --
T_row --; // row loop --
// Assign a value to a column
For (int K = 0; k <t_row; k ++ ){
I + =-1;
M [math. Abs (I)] [math. Abs (j)] = n --;
}
If (n = 0) break; // exit if the value has been assigned
J =-J;
I =-I;
}
Print (m );
}
/**
* Print a two-dimensional array
* @ Param
*/
Static void print (INT [] [] ){
For (INT I = 0; I <A. length; I ++ ){
For (Int J = 0; j <A [I]. length; j ++ ){
System. Out. Print ("" + A [I] [J]);
}
System. Out. println ();
}
}
Method 2:
Principle: first fill in the data in the outermost ring. If there is still inner ring data, the recursive call itself continues to fill in inner ring data until it is filled out.
Public class round {
Public static void main (string [] ARGs ){
Int ROW = 10; // several rows
Int Col = 10; // Several columns
Int [] [] A = new int [row] [col];
Fill (A, row, Col, 0, 0 );
Print ();
}
/**
* Enter the data in the outermost ring. If there is any inner ring, the recursive call itself continues to enter inner ring data until it is filled out.
* @ Param
* @ Param row
* @ Param col
* @ Param I
* @ Param J
*/
Private Static void fill (INT [] [] A, int row, int Col, int I, Int J ){
Int n = row * Col;
For (int c = 0; C <= col-1; C ++) {// horizontal fill Value
A [I] [J + C] = n-C; // enter the value from left to right in the first line.
If (row! = 1)
A [I + row-1] [J + C] = N-(COL * 2 + row-3) + C; // if there are more than one row, enter a value from left to right in the last line.
}
For (INT r = 0; r <row-2; r ++) {// vertical fill Value
A [I + row-2-r] [J] = A [I + row-1] [J]-R-1; // enter a value from bottom up In the first column
If (Col! = 1) // if there are more than one column, fill in the value of the big last column from bottom to top
A [I + row-2-r] [J + col-1] = A [I + row-1] [J + col-1] + R + 1;
Else // otherwise overwrite the first column of data
A [I + row-2-r] [J] = A [I + row-1] [J] + R + 1;
}
If (Row-2> 0 & col-2> 0) Fill (A, row-2, col-2, I + 1, J + 1 ); // if the data has not been filled in, enter it recursively
}
/**
* Print a two-dimensional array
* @ Param
*/
Private Static void print (INT [] [] ){
For (INT I = 0; I <A. length; I ++ ){
For (Int J = 0; j <A [0]. length; j ++ ){
System. Out. printf ("% 4D", a [I] [J]);
}
System. Out. println ();
}
}
}