天天看點

藍橋杯 基礎練習VIP 回形取數 java藍橋杯 基礎練習VIP 回形取數 java題目代碼

藍橋杯 基礎練習VIP 回形取數 java

題目

題目描述

回形取數就是沿矩陣的邊取數,若目前方向上無數可取或已經取過,則左轉90度。一開始位于矩陣左上角,方向向下。

輸入

輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。

輸出

輸出隻有一行,共mn個數,為輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。

樣例輸入

3 3

1 2 3

4 5 6

7 8 9

樣例輸出

1 4 7 8 9 6 3 2 5

代碼

http://www.dotcpp.com/blog/56979.html

代碼中 4 個 while,按照 先後順序,依次判斷是否 滿足條件。進行到 最後一個 left時,因為 cnt < n*m,是以 繼續 依次 while。

import java.io.IOException;
import java.util.Scanner;

public class Main {	
	public static void main(String[] args) throws IOException{
		Scanner in = new Scanner(System.in);
        int m = in.nextInt(),n = in.nextInt();
        int [][]a = new int[m][n];
        for(int i = 0;i<m;i++) 
            for(int j = 0;j<n;j++) 
                a[i][j] = in.nextInt();
        int [][]flag = new int[m][n];
        System.out.print(a[0][0]);
        flag[0][0]=1;
        int i = 1,j = 0,cnt = 1;
        while (cnt < n * m) 
        {
            //down
            while (i < m && flag[i][j] == 0 ) 
            {
                flag[i][j] = 1;
                System.out.print(" " + a[i++][j]);
                cnt++;
            }
            i--;j++;
            //right
            while ( j<n && flag[i][j] == 0)
            {
                flag[i][j] = 1;
                System.out.print(" " + a[i][j++]);
                cnt++;
            }
            j--;i--;
            //up
            while (i>= 0 && flag[i][j] == 0) 
            {
                flag[i][j] = 1;
                System.out.print(" " + a[i--][j]);
                cnt++;
            }
            i++;j--;
            //left
            while (j>=0 && flag[i][j] == 0) 
            {
                flag[i][j] = 1;
                System.out.print(" " + a[i][j--]);
                cnt++;
            }
            j++;i++;
        }
        System.out.println();
    }  
}