螺旋矩阵(java实现)

题目一

对于一个 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,表示要求的行号和列号。

输出格式

输出一个整数,表示螺旋矩阵中第 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。
  
图解:(按照下图所示的方向进行遍历)

1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzBPipfJ-1587352592963)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200420024812854.png)]
螺旋矩阵的思路:

  1. 定义上下左右四个方向
  • 左方向的初始值就是二维数组的最左一列下标(left)
  • 右方向的初始值就是二维数组的最右一列下标(right)
  • 上方向的初始值就是二维数组的最上一行下标(top)
  • 下方向的初始值就是二维数组的最下一行下标(bottom)
  1. 按照"右->下->左->上"的方向对二维数组进行填充,初始就是往右方向进行遍历,注意的是外层循环的条件就是左方向的值要小于等于右方向并且上方向的值要小于等于下方向
  • 右方向遍历:for循环变量的初始值就是left,当达到right边界的时候,说明上面已经遍历完一行了,所以top++,准备向下遍历,需要将遍历的方向改为bottom;
  • 下方向遍历:for循环变量的初始值就是top,当达到bottom边界的时候,说明右边已经遍历完一列了,所以right- -,准备向左遍历,需要将遍历的方向改为left;
  • 左方向遍历:for循环变量的初始值就是right,当达到left边界的时候,说明下面已经遍历完一行了,所以bottom- -,准备向上遍历,需要将遍历的方向改为top;
  • 上方向遍历:for循环变量的初始值就是bottom,当达到top边界的时候,说明左边已经遍历完一列了,所以left++,准备向右遍历,需要将遍历的方向改为right;

代码实现:

public class Main {
   
   

	public static void main(String[] args) {
   
   

		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();//行
		int m=sc.nextInt();//列
		int r=sc.nextInt();//第几行,不是指行下标
		int c=sc.nextInt();//第几列,不是指列下标
		sc.close();
		int[][] arr=new int[n][m];
		int left=0;//左方向
		int right=arr[0].length-1;//右方向
		int top=0;//上方向
		int bottom=arr.length-1;//下方向
		
		String direction="right";//要遍历的方向
		int temp=1;
		while
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值