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
樣例輸入
3 2
1 2
3 4
5 6
樣例輸出

1 3 5 6 4 2





解題思路:如下圖一個四行五列的矩陣,根據回形取數的方法我用紅筆畫出了取數的路線,我們可以發現兩個圈讀取的方法是相同的(但下個循環的行數和列數都比前一個循環的少2),所以我們可以採用循環來實現這種取法,循環需要個終止條件,我們不難想到只要取出的個數等於矩陣的總數就讓它跳出循環。

一次提交就是滿分嘻嘻

/**
 * 
 */
package 基礎練習;

import java.util.Scanner;

/**
 * @author Administrator 問題描述
 *         回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。 輸入格式
 *         輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。 輸出格式
 *         輸出只有一行,共mn個數,爲輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。
 */
public class 回型取數 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int[][] a = new int[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				a[i][j] = sc.nextInt();

			}

		}
		int tot = 0, x = -1, y = 0;
		while (tot < m * n) {
			while (x + 1 < m && a[x + 1][y] != -1) {
				System.out.print(a[++x][y]+" ");
				a[x][y] = -1;
				++tot;
			}
			while (y + 1 < n && a[x][y + 1] != -1) {
				System.out.print(a[x][++y]+" ");
				a[x][y] = -1;
				++tot;
			}
			while (x - 1 >= 0 && a[x - 1][y] != -1) {
				System.out.print(a[--x][y]+" ");
				a[x][y] = -1;
				++tot;
			}

			while (y - 1 >= 0 && a[x][y - 1] != -1) {
				System.out.print(a[x][--y]+" ");
				a[x][y] = -1;
				++tot;
			}
		}

		// for (int i = 0; i < m; i++) {
		// for (int j = 0; j < n; j++) {
		// System.out.println(a[i][j]);
		//
		// }
		// }
	}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章