题目
问题描述
对于一个 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);
}
}