P5731 蛇形矩阵 十一届蓝桥杯模拟 螺旋矩阵

引入

  • 这两题都是运用了数组存储思想 差别运用三种方法编写🚀🚀

蛇形矩阵

跳转链接
在这里插入图片描述

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 ;
	}

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值