第十一届 蓝桥杯 省模拟赛 螺旋矩阵

螺旋矩阵

题目
问题描述

对于一个 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。

我把这个数组给打出来了,你们要输出这个数就可以再改一下输入和输出

package 第二次蓝桥;

import java.util.Scanner;

public class 螺旋数组 {
	public static int[][] spiralOrder(int n,int m){
		int[][] num=new int[n][m];
		int row=0,col=0;
		num[row][col]=1;
		int upBound=0;
		int rightBound=num[0].length-1;
		int leftBound=0;
		int downBound=num.length-1;
		int temp=1;
		
		
		while(true){
			for(int i=leftBound;i<=rightBound;i++)
				num[upBound][i]=temp++;
			if(++upBound>downBound) break;
			for(int i=upBound;i<=downBound;i++)
				num[i][rightBound]=temp++;
			if(--rightBound<leftBound) break;
			for(int i=rightBound;i>=leftBound;--i)
				num[downBound][i]=temp++;
			if(--downBound<upBound) break;
			for(int i=downBound;i>=upBound;--i)
				num[i][leftBound]=temp++;
			if(++leftBound>rightBound) break;
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)
				System.out.print(num[i][j]+" ");
			System.out.println();
		}
		return num;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		spiralOrder(n,m);
	}

}

题目

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

题一

package 第二次蓝桥;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 螺旋数组 {
	public static List<Integer> spiralOrder(int[][] matrix){
		List<Integer> list=new ArrayList<Integer>();
		if(matrix==null||matrix.length==0)
			return list;
		int m=matrix.length;//行数
		//System.out.println(m);
		int n=matrix[0].length;//列数
		//System.out.println(n);
		int i=0;
		
		//统计矩阵从外向内的层数,如果矩阵非空,那么他的层数至少位1
		int count=(Math.min(m,n)+1)/2;//层数最少为1,所以加一
		//从外部向内部遍历,逐层打印数据
		while(i<count){
			for(int j=i;j<n-i;j++)//从左到右
				list.add(matrix[i][j]);
			for(int j=i+1;j<m-i;j++)//从上往下
				list.add(matrix[j][(n-1)-i]);
			//第 3 个:从右往左,如果这一层只有1行,那么第一个循环已经将该行打印了,这里就不需要打印了
			for(int j=(n-1)-(i+1);j>=i&&(m-1-i!=i);j--)
				list.add(matrix[(m-1)-i][j]);
			for(int j=(m-1)-(i+1);j>=i+1&&(n-1-i)!=i;j--)
				list.add(matrix[j][i]);
			i++;
		}
		for(int q=0;q<list.size();q++){
			System.out.printf("%5d",list.get(q));
			System.out.print(" ");
			if(q>=(n-1)&&(q+1)%n==0)
				System.out.println();
		}
		//System.out.println(list);
		return list;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int[][] matrix=new int[n][m];
		int temp=1;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)
				matrix[i][j]=temp++;
		}
		spiralOrder(matrix);
		
	}

}

你可能感兴趣的:(算法,蓝桥)