您的位置:首页 > 其它

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)。

输出:
对应每个测试案例,输出一行,

按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。

样例输入:
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); // 改变长宽度和初始点位置
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: