java-day15
目录
回旋数字
规律
1.矩阵的行数和列数就是我们的参数
例如:参数是3,那么矩阵就是3行3列
2.矩阵中的数字,最大是参数的平方
例如:参数是5,那么矩阵中最大的数字就是25
3.矩阵中的数字的排列是有规律,从1到参数的平方,然后转着圈圈回旋输出
例如:参数是3 1 2 3 8 9 4 7 6 5
4.数字从小到大,输出的模式有四种
4.1 从左往右 → 模式0 4.2 从上往下 ↓ 模式1 4.3 从右往左 ← 模式2 4.4 从下往上 ↑ 模式3
5.数字输出的四种模式之间也有关系
在当前模式下,满足某一个【条件】后,输出的模式就要变化(回旋) 变化的规律: 模式0如果需要转变模式,那么一定是转为模式1 模式1如果需要转变模式,那么一定是转为模式2 模式2如果需要转变模式,那么一定是转为模式3 模式3如果需要转变模式,那么一定是转为模式0
6.我们可以把这个矩阵,想象成在一个二维数组中
例如:这个参数为5的矩阵 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
矩阵在二维数组中: int arr = { {1, 2, 3, 4, 5}, {16, 17, 18, 19, 6}, {15, 24, 25, 20, 7}, {14, 23, 22, 21, 8}, {13, 12, 11, 10, 9} };
然后可以把这个二维数组想象成这个样子:
| 0 1 2 3 4 ------------------------- Y坐标 0 | 1 2 3 4 5 1 | 16 17 18 19 6 2 | 15 24 25 20 7 3 | 14 23 22 21 8 4 | 13 12 11 10 9 | X坐标
7.基于上面第六个点的分析结果,代码如下
代码
//回旋数字
public void test1(int size){
//一个size行size列的矩阵(二维数组)
int[][] arr = new int[size][size];
int maxValue = size*size;
//当前数字输出的模式,分别有0 1 2 3
//0模式 从左到右
//1模式 从上到下
//2模式 从右到左
//3模式 从下到上
int mode = 0;
//这个矩阵中的每个位置的坐标
//注意,这个矩阵其实就是我们操作的二维数组
int x = 0;
int y = 0;
//构造二维数组,并且给每个位置赋值
//变量i从1开始,最大值到maxValue
//[1,maxValue]就是每次在循环中需要放到数组arr中的一个值
//从1到maxValue,把值放完之后,arr数组刚好放满
for(int i=1;i<=maxValue;i++){
//在循环中,我们需要安装相应的规律,
//找到每个数字应该放在arr数组中的一
//个合适的位置,然后将其放入
//这里是思路是先给位置赋值,然后根据模
//式来判断下一个坐标应该怎么去变化,判
//断完成后改变坐标(相当于这个游戏人物
//在地图中又往前走了一个格子)
//1 赋值
arr[x][y] = i;
//2 根据不同模式进行判断下一步怎么走
switch(mode){
//如果是模式0
case 0:{
//正常往前移动的模式0
//当y坐标不是最大值 && y+1位置的值是0
if(y!=size-1 && arr[x][y+1]==0){
y++;
}
//下一步需要转变为模式1
else{
mode = 1;
x++;
}
break;
}
case 1:{
//正常往前移动的模式1
//当x坐标不是最大值 && x+1位置的值是0
if(x!=size-1 && arr[x+1][y]==0){
x++;
}
//下一步需要转变为模式2
else{
mode = 2;
y--;
}
break;
}
case 2:{
//正常往前移动的模式2
//当y坐标不是0 && y-1位置的值是0
if(y!=0 && arr[x][y-1]==0){
y--;
}
//下一步需要转变为模式3
else{
mode = 3;
x--;
}
break;
}
case 3:{
//正常往前移动的模式3
//当x坐标不是0 && x-1位置的值是0
if(x!=0 && arr[x-1][y]==0){
x--;
}
//下一步需要转变为模式0
else{
mode = 0;
y++;
}
break;
}
}
}
//把构建好的二维数组,进行循环遍历输出
for(int i=0;i<arr.length;i++){
//输出每一行数字
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
//输出一个换行
System.out.println();
}
}
可变参数
一种特殊的语法,表示方法的参数可以有不同的数量。
JDK1.5及以上版本支持
public void test(int [] a){
}
//在调用方法的时候,只能传一个数组对象作为参数
main:
int [] arr={1,2,3};
t.test(arr);
//如果使用可变参数,可以变成
public void test(int... a){
}
//在调用这种方法的时候,我们所传的参数就有多种选择了
方法中只有一个可变参数,没有其他参数
注意,在test方法中,这个可变参数a,其实就是一个int类型的数组,在方法中可以直接把a当做数组来使用,如果我们没有传任何参数,那么这个数组a的长度就是0,如果传1个参数,那么数组a的长度是1,数组里面的数据就是我们所传的参数,依次类推,传多个参数的情况也是类似的。额外的我们还可以把一个数组当做参数传进来,因为这个可变参数a在方法的本来就是一个数组,刚好可以接收我们传的参数
可变参数与其他参数共存
例如:
public void test(String str,int...a){
}
共存的时候可变参数必须放在最后的位置(否则编译报错)
最多只能放一个可变参数(否则编译报错)
可变参数的每一个数据类型都必须相同
实例
public void test7(int... a){
int begin = 1;
int end = 100;
int len = a.length;
switch(len){
case 0:{
break;
}
case 1:{
begin = a[0];
break;
}
case 2:{
begin = a[0];
end = a[1];
break;
}
default:{
System.out.println("所传参数过多,采用默认值");
}
}
if(end < begin){
throw new RuntimeException("参数传递有误,开始值不能超过结束值,当前开始为"+begin+"结束时为"+end);
}
int result = 0;
for(int i=begin;i<=end;i++){
result+=i;
}
System.out.println("from "+begin+" to "+end+" result="+result);
}