记录下。
题目要求:一个矩阵n行m列,输出如下的矩阵
比如,n = 4, m = 5
0 1 2 3 4
13 14 15 16 5
12 19 18 17 6
11 10 9 8 7
比如, n = 3, m = 4
0 1 2 3
9 10 11 4
8 7 6 5
我的思路,从下标找下规律,相当于有几个圈,而每个圈的终止条件为当i值为初始的i值+1,j为初始的j值时,一圈结束。比如,第一个初始的下标为(0,0),则结束的下标为(1,0)。然后新的一圈的下标初始为(1,1),则结束的下标为(2,1)。圈数为n值的一半。最后填充下被while条件除掉的一个值。如果n为奇数,也要进行最中间一行数值的填充。
代码实现:
package baiao;
public class Test3 {
public static void main(String[] args) {
print(8, 9);
}
public static void print(int n, int m) {
int[][] a = new int[n][m];
int ibegin = 0;//for循环的初始条件
int jbegin = 0;
int iend = n - 1;
int jend = m - 1;
int icircle = 0;//while 循环开始
int jcircle = 0;
int i = 0;//while循环里变化的i
int j = 0;
int tmp = 0;//矩阵填充的值
//System.out.println("\\\\");
for(int k = 0; k < n / 2; k++) {
//System.out.println(k + " ");
while(!(i == icircle + 1 && j == jcircle)){
//System.out.println("tmp: " + tmp);
if(j < jend && i == ibegin) {
a[i][j] = tmp;
//System.out.println("1i,j" + i + " " + j + "a" + a[i][j]);
tmp++;
j++;
}
else if(j == jend && i < iend) {
a[i][j] = tmp;
//System.out.println("2i,j" + i + " " + j + "a" + a[i][j]);
tmp++;
i++;
}
else if(j > jbegin && i == iend) {
a[i][j] = tmp;
//System.out.println("3i,j" + i + " " + j + "a" + a[i][j]);
tmp++;
j--;
}
else if(i > ibegin) {
a[i][j] = tmp;
//System.out.println("4i,j" + i + " " + j + "a" + a[i][j]);
tmp++;
i--;
}
}//一圈完成
icircle++;
jcircle++;
ibegin++;
jbegin++;
iend--;
jend--;
//System.out.println(icircle + " " + jcircle + " " + ibegin + " " + jbegin + " " + iend + " " + jend + " ");
}//for结束
a[i][j] = tmp;//i==icircle + 1,j == jcircle值的填充
tmp++;
//System.out.println( jbegin + " " + jend);
//当n为奇数时,补充最中间的一行
if(n % 2 != 0) {
for(j = jbegin; j <= jend; j++) {
a[i][j] = tmp;
tmp ++;
}
}
//输出矩阵
for(int k1 = 0; k1 < n ; k1++) {
for(int k2 = 0; k2 < m; k2++) {
System.out.print(a[k1][k2] + " ");
}
System.out.println();
}
}
}
输出
0 1 2 3 4 5 6 7 8
29 30 31 32 33 34 35 36 9
28 51 52 53 54 55 56 37 10
27 50 65 66 67 68 57 38 11
26 49 64 71 70 69 58 39 12
25 48 63 62 61 60 59 40 13
24 47 46 45 44 43 42 41 14
23 22 21 20 19 18 17 16 15