代码送上:
int mi = 0, ni = 0; //行起始索引,列起始索引
int m = 8, n = 11; //行末尾索引+1,列末尾索引+1(开始时为行数,列数)
int elemNum = m * n; //数组总元素数
int value = 1; //赋值计数器
int times = (m>n) ? (2*m-1) : (2*n); //赋值的大循环次数(螺旋的圈数)
int[][] matrix = new int[m][n]; //数组接收数据
Flag:
for (int i = 0; i < times/2 ; i++) { //4次赋值循环为一个大循环(螺旋转了一圈)
for (int a = ni; a < n; a++) { //第一次赋值循环(第一排)
matrix[mi][a] = value++;
if (value > elemNum) //如果所有元素都已经被赋值,则跳出循环,后面每个小循环都有这段代码
break Flag;
}
mi++; //数组的第一行(matrix[mi==0][x])已全部赋值,不可再被访问
for (int a = mi; a < m; a++) { //第二次赋值循环(最后一列)
matrix[a][n-1] = value++;
if (value > elemNum)
break Flag;
}
n--; //数组的最后一列(matrix[x][n-1])已全部赋值,不可再被访问
for (int a = ni; a < n; a++) { //第三次赋值(最后一行,逆序)
matrix[m-1][n-a+(i-1)] = value++; //因为n-a每轮差值会减2(n--,ni++),所以补上一个常数(i-1),以抵消差值的影响
if (value > elemNum)
break Flag;
}
m--; //数组的最后一行(matrix[m-1][x])已全部赋值,不可再被访问
for (int a = mi; a < m; a++) { //第四次赋值(第一列,逆序)
matrix[m-a+(i)][ni] = value++; //同三,因为m-a每轮差值会减2(m++,mi++),所以补上常数(i),以抵消差值的影响
if (value > elemNum)
break Flag;
}
ni++; //数组的第一列(matrix[x][ni==0])已全部赋值,不可再被访问
}
for (int[] line : matrix) { //输出语句
for (int elem : line) {
System.out.print(elem + "\t");
}
System.out.println();
} |