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行を出力し、
各数字を時計回りに順番に印刷し、各数字の後ろにスペースがあります.
サンプル入力:
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);       //    
	    }  
	      
}