1391:時計回り印刷マトリックス@jobdu
3805 ワード
タイトル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の順に印刷する.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力された最初の行は、2つの整数mおよびn(1<=m、n<=1000)を含む.マトリクスの次元数がm行n列であることを示す.
次のm行は、各行にn個の整数を含み、マトリクスの要素を表し、各要素aの値範囲は(1<=a<=10000)である.
出力:
各テストケースに対応して1行を出力し、
各数字を時計回りに順番に印刷し、各数字の後ろにスペースがあります.
サンプル入力:
サンプル出力:
質疑応答:
問題を解くのに問題がありますか.解題の心得を分かち合いますか?このトピックについては、次のトピックを参照してください.http://t.jobdu.com/thread-8114-1-1.html
これと同じです.
http://blog.csdn.net/fightforyourdream/article/details/16876107
でもTLEの最後のcaseは
時間制限: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の順に印刷する.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力された最初の行は、2つの整数mおよびn(1<=m、n<=1000)を含む.マトリクスの次元数がm行n列であることを示す.
次のm行は、各行にn個の整数を含み、マトリクスの要素を表し、各要素aの値範囲は(1<=a<=10000)である.
出力:
各テストケースに対応して1行を出力し、
各数字を時計回りに順番に印刷し、各数字の後ろにスペースがあります.
サンプル入力:
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][n];
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); //
}
}