1391:顺时针打印矩阵 @jobdu
2013-12-19 05:50
267 查看
题目1391:顺时针打印矩阵
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1373
解决:370
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。
接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。
输出:
对应每个测试案例,输出一行,
按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。
样例输入:
样例输出:
答疑:解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8114-1-1.html
与这篇一样:
http://blog.csdn.net/fightforyourdream/article/details/16876107
但是会TLE最后一个case
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class S20 {
public static void main(String[] args) throws FileNotFoundException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream("in.in"));
System.setIn(in);
Scanner cin = new Scanner(System.in);
while (cin.hasNextInt()) {
int m = cin.nextInt();
int n = cin.nextInt();
// System.out.println("m:" + m + ", n:" + n);
int[][] buf = new int[m]
;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
buf[i][j] = cin.nextInt();
}
}
// printout(buf);
ArrayList<Integer> ret = spiralOrder(buf);
for(int i=0; i<ret.size(); i++){
System.out.print(ret.get(i) + " ");
}
System.out.println();
}
}
// My LeetCode solution
public static ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> ret = new ArrayList<Integer>();
if(matrix.length == 0){
return ret;
}
int m = matrix.length;
int n = matrix[0].length;
int margin = 1;
rec(matrix, m, n, margin, 0, 0, ret);
return ret;
}
/*
n
______________(x,y+n-1)
|(x,y) |
| | m
|_____________ |
(x+m-1,y) (x+m-1,y+n-1)
m: 矩阵高度
n: 矩阵宽度
margin: 每次变化后减少量,此题固定为1
x,y: 左上角坐标
可以推出,右上角坐标为(y+n)
*/
public static void rec(int[][] matrix, int m, int n, int margin, int x, int y, ArrayList<Integer> ret){
if(m<=0 || n<=0){
return;
}
if(m==1 && n==1){ // 只包含一个元素的情况
ret.add(matrix[x][y]);
return;
}else if(m==1 && n!=1){ // 只有一行的情况
for(int j=y; j<y+n; j++){
ret.add(matrix[y][j]);
}
return;
}else if(m!=1 && n==1){ // 只有一列的情况
for(int i=x; i<x+m; i++){
ret.add(matrix[i][x]);
}
return;
}
// 以下是有多行多列的情况
for(int i=y; i<y+n-margin; i++){ // 向右
ret.add(matrix[x][i]);
}
for(int i=x; i<x+m-margin; i++){ // 向下
ret.add(matrix[i][y+n-margin]);
}
for(int i=y+n-margin; i>x; i--){ // 向左
ret.add(matrix[x+m-margin][i]);
}
for(int i=x+m-margin; i>x; i--){ // 向上
ret.add(matrix[i][y]);
}
rec(matrix, m-2, n-2, margin, x+1, y+1, ret); // 改变长宽度和初始点位置
}
}
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1373
解决:370
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。
接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。
输出:
对应每个测试案例,输出一行,
按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。
样例输入:
4 41 2 3 45 6 7 89 10 11 1213 14 15 16
样例输出:
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
答疑:解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8114-1-1.html
与这篇一样:
http://blog.csdn.net/fightforyourdream/article/details/16876107
但是会TLE最后一个case
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class S20 {
public static void main(String[] args) throws FileNotFoundException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream("in.in"));
System.setIn(in);
Scanner cin = new Scanner(System.in);
while (cin.hasNextInt()) {
int m = cin.nextInt();
int n = cin.nextInt();
// System.out.println("m:" + m + ", n:" + n);
int[][] buf = new int[m]
;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
buf[i][j] = cin.nextInt();
}
}
// printout(buf);
ArrayList<Integer> ret = spiralOrder(buf);
for(int i=0; i<ret.size(); i++){
System.out.print(ret.get(i) + " ");
}
System.out.println();
}
}
// My LeetCode solution
public static ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> ret = new ArrayList<Integer>();
if(matrix.length == 0){
return ret;
}
int m = matrix.length;
int n = matrix[0].length;
int margin = 1;
rec(matrix, m, n, margin, 0, 0, ret);
return ret;
}
/*
n
______________(x,y+n-1)
|(x,y) |
| | m
|_____________ |
(x+m-1,y) (x+m-1,y+n-1)
m: 矩阵高度
n: 矩阵宽度
margin: 每次变化后减少量,此题固定为1
x,y: 左上角坐标
可以推出,右上角坐标为(y+n)
*/
public static void rec(int[][] matrix, int m, int n, int margin, int x, int y, ArrayList<Integer> ret){
if(m<=0 || n<=0){
return;
}
if(m==1 && n==1){ // 只包含一个元素的情况
ret.add(matrix[x][y]);
return;
}else if(m==1 && n!=1){ // 只有一行的情况
for(int j=y; j<y+n; j++){
ret.add(matrix[y][j]);
}
return;
}else if(m!=1 && n==1){ // 只有一列的情况
for(int i=x; i<x+m; i++){
ret.add(matrix[i][x]);
}
return;
}
// 以下是有多行多列的情况
for(int i=y; i<y+n-margin; i++){ // 向右
ret.add(matrix[x][i]);
}
for(int i=x; i<x+m-margin; i++){ // 向下
ret.add(matrix[i][y+n-margin]);
}
for(int i=y+n-margin; i>x; i--){ // 向左
ret.add(matrix[x+m-margin][i]);
}
for(int i=x+m-margin; i>x; i--){ // 向上
ret.add(matrix[i][y]);
}
rec(matrix, m-2, n-2, margin, x+1, y+1, ret); // 改变长宽度和初始点位置
}
}
相关文章推荐
- 题目1391:顺时针打印矩阵
- 九度OJ-题目1391:顺时针打印矩阵
- 【剑指Offer面试题】 九度OJ1391:顺时针打印矩阵
- 题目1391:顺时针打印矩阵-九度
- 题目1391:顺时针打印矩阵
- 题目1391:顺时针打印矩阵
- 剑指Offer - 九度1391 - 顺时针打印矩阵
- 【剑指Offer面试编程题】题目1391:顺时针打印矩阵--九度OJ
- 【剑指Offer面试编程题】题目1391:顺时针打印矩阵--九度OJ
- 九度oj-1391-顺时针打印矩阵
- 九度 题目1391:顺时针打印矩阵
- [Jobdu] 题目1391:顺时针打印矩阵
- 剑指OFFER之顺时针打印矩阵(九度OJ1391)
- 面试题20:顺时针打印矩阵递归和非递归两种方式实现
- 算法题目---顺时针打印矩阵
- 牛客网刷题之顺时针打印矩阵
- 剑指offer--面试题29:顺时针打印矩阵
- 面试题40:顺时针打印矩阵
- 输入一个矩阵,由外向里顺时针打印数字
- 20、顺时针打印矩阵