引入
- 这两题都是运用了数组存储思想 差别运用三种方法编写🚀🚀
蛇形矩阵
Java 代码
import java.util.Scanner;
/**
* @author LZH.create
* Date : 2021.3.31
* 右 下 左 上
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int n = sc.nextInt() ;
int k=1,x=1,y=0;
int [][] a = new int[15][15];
while (k<=n*n)
{
while(y<n&& a[x][y+1]==0)a[x][++y]=k++; // y=0
while(x<n&&a[x+1][y]==0)a[++x][y]=k++;
while(y>1&&a[x][y-1]==0)a[x][--y]=k++;
while(x>1&&a[x-1][y]==0)a[--x][y]=k++;
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++) {
System.out.format("%3d",a[i][j]);
if(j%n==0) System.out.println();
}
}
}
}
螺旋矩阵
- 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入格式: 输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。第二行包含两个整数 r, c,表示要求的行号和列号。
样例输入
4 5
2 2
样例输出
15
评测用例规模与约定
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。
Java 代码
package SimulationGame11;
import java.util.Scanner;
/**
* @author LZH.create
* 第十一届蓝桥杯模拟赛 旋转矩阵 打断点测试
*/
public class rotateMatrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int n = sc.nextInt() ;
int m = sc.nextInt() ;
int x = sc.nextInt() ;
int y = sc.nextInt() ;
int [][] arr = new int[m][n] ;
//System.out.println(array01.length); // 矩阵行
//System.out.println(array01[0].length); // 矩阵列
int temp = 1 ;
int up = 0 ;
int down = arr.length-1 ;
int left = 0 ;
int right = arr[0].length - 1 ;
while(true){
for(int i=left; i<=right; ++i) // 右
arr[up][i]=temp++;
if(++up>down) break; // 上有 up 参数所以这里是 up 约束条件
for(int i=up; i<=down; ++i) // 下
arr[i][right]=temp++;
if(--right<left) break;
for(int i=right; i>=left; --i) // 左
arr[down][i]=temp++;
if(--down<up) break;
for(int i=down; i>=up; --i) // 上 这里的 up 变为 1
arr[i][left]=temp++;
if(++left>right) break;
}
System.out.println(arr[x-1][y-1]);
}
}
螺旋矩阵(LeetCode54)
- 先来个小知识点
package lzhTest;
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
List<Integer> ans = new ArrayList<>() ;
ans.add(3) ;
ans.add(5) ;
ans.add(9) ;
System.out.println(ans);
}
}
输出 :
[3,4,9]
Java 代码
package SimulationGame11;
import java.util.ArrayList;
import java.util.List;
/**
* @author LZH.create
* LeetCode 54 先来介绍下本题思想
* 利用 数组 0 1 -1 分别表示 方向
*/
public class SpiralMatrix {
public static void main(String[] args) {
int [][] matrix = {{1,2,3},{4,5,6},{7,8,9}} ;
System.out.println(fun(matrix));
System.out.println(matrix[0].length);
System.out.println(matrix.length);
}
public static List<Integer> fun(int [][] arr){
List ans = new ArrayList<>() ; // 记录输出
int [] dx = {0,1,0,-1} ; // 用数组表示方向
int [] dy = {1,0,-1,0} ;
int startX = 0 ;
int startY = 0 ;
int row = arr.length ;
int col = arr[0].length ;
int d = 0 ;
for(int i =0 ; i < row * col ; i++) {
ans.add(arr[startX][startY]) ;
arr[startX][startY] = 101 ; // 标记已近用过
int curX = startX + dx[d] ;
int curY = startY + dy[d] ;
if(curX < 0 || curY < 0 || curX >= row || curY >= col || arr[curX][curY] == 101) {
d = (d + 1) % 4 ;
}
startX += dx[d] ;
startY += dy[d] ;
}
return ans ;
}
}