问题:
读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右、下、左、上螺旋填入的结果。 例如读入数字4,5,则输出结果为:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
分析:
由题意知,上述数据从左到右又重上倒下呈一个螺旋形状,那我们怎么使用代码把他表示出来呢?这里可以用到一个二维数组来解决这类问题。首先我们可以先定义一个行变量(row)和一个列变量(col),再定义一个二维数组:
int[][] direction={{0,1},//向右
{1,0},//向下
{0,-1},//向左
{-1,0}//向上
};
那我们该怎么使用这个二维数组来完成螺旋填数呢?
1)首先我们从第一行第一列的元素arr[row][col]=1开始1向右填数,当数字为5的时候在向下填数填到8,一次操作知道填到20。
2)然后我们再聊一聊怎么让数字进行转向,在我们定义的行(row)和列(col)变量中当行不变列加一就相当于向右移动一格,那么列不变行加一相当于向下移动一格。再举一个例子当有数字8转向数字9时就要行不变列减一。
row=row+diraction[diractionIndex][0];//行
col=col+diraction[diractionIndex][1];//列
上面代码中进行行列加减变化是在原本行列基础上加上一个二维数组相当于行或列加一
3)最后我们再聊一聊转向的条件当第一行加到5时就要进行转向了,此时需要一个判断条件
,条件为当行数大于5时行列变化变为列加一行加0
下面进行代码演示
int[][] arr=new int[4][5];//表明二维数组是4行5列
//用变量去表示行和列
int row=0;//行
int col=0;//列
//初始化第一个值
arr[row][col]=1;//表示的是坐标(0,0)的值为1
//存储坐标的二维数组(方向)
int[][] diraction= {{0,1},//往右
{1,0},//往下
{0,-1},//往左
{-1,0}//往上
};
//控制方向数组的下标
int diractionIndex=0;
//操作for循环,依次给二维数组赋值
for(int i=2;i<=20;i++) {
//得到新的行列值
row=row+diraction[diractionIndex][0];//行
col=col+diraction[diractionIndex][1];//列
//判断转向的条件
if((row<0||row>3)||(col<0||col>4)||(arr[row][col]!=0)) {
//回退到上一次的坐标
row=row-diraction[diractionIndex][0];
col=col-diraction[diractionIndex][1];
//控制转向---方向数组的下标挪动
diractionIndex++;
//保证只有四个方向
if(diractionIndex==4) {
//方向走到最后一个需要重新置为0
diractionIndex=0;
}
//通过新的方向的到新的坐标
row=row+diraction[diractionIndex][0];
col=col+diraction[diractionIndex][1];
}
//赋值
arr[row][col]=i;
} //遍历
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++) {
System.out.print(arr[i][j]+" ");
}
//换行
System.out.println();
}
这样我就们聊完了如何用二维数组完成螺旋填数的问题。
感谢阅读^ ^!