andy6804tw
2/21/2017 - 9:05 AM

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=3019 這題螺旋矩陣最直覺方法就是模擬,那如何做呢?首先不管順(逆)時鐘都有個規律,建議各位還是在紙上寫下每個位置的索引值如下: [0,0] [0

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=3019

這題螺旋矩陣最直覺方法就是模擬,那如何做呢?首先不管順(逆)時鐘都有個規律,建議各位還是在紙上寫下每個位置的索引值如下:

[0,0] [0,1] [0,2] [0,3] [1,0] [1,1] [1,2] [1,3] [2,0] [2,1] [2,2] [2,3] [3,0] [3,1] [3,2] [3,3]

看到這可能還是很模糊,我們在看下面這張圖搭配索引值發現他其實是有規律的,以順時鐘來說我們依序由上排佐至右,接下來又半部由上而下,然後下半部由右至左,最後左邊由下而上內層一樣按照此規律 那在這各位可能會問我們怎知道有幾層呢?把它當作洋蔥n=4時他有4/2=2層(迴圈跑兩次的意思,觀察索引值),那當遇到偶數時該怎麼辦呢?n=5,時就有5/2=2層,你可以發現他其實還有一層但他只有一個數字,可以把它當作成是圓的中心點個別處理arr[n / 2][n / 2] = count;

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner scn = new Scanner(System.in);
		String str[] = scn.nextLine().split(",");
		int n = Integer.parseInt(str[0]), index = Integer.parseInt(str[1]), count = 1, arr[][] = new int[n][n];
		if (index == 1) {//順時鐘
			for (int i = 0; i < n / 2; i++) {
				for (int j = i; j < n - i - 1; j++)
					arr[i][j] = count++;
				for (int j = i; j < n - i - 1; j++)
					arr[j][n - i - 1] = count++;
				for (int j = n - i - 1; j > i; j--)
					arr[n - i - 1][j] = count++;
				for (int j = n - i - 1; j > i; j--)
					arr[j][i] = count++;
			}
		} else {//逆時鐘
			for (int i = 0; i < n / 2; i++) {
				for (int j = i; j < n - i - 1; j++)
					arr[j][i] = count++;
				for (int j = i; j < n - i - 1; j++)
					arr[n - 1 - i][j] = count++;
				for (int j = n - i - 1; j > i; j--)
					arr[j][n - i - 1] = count++;
				for (int j = n - i - 1; j > i; j--)
					arr[i][j] = count++;
			}
		}
		if (n % 2 != 0)//遇到基數層要補上中心數
			arr[n / 2][n / 2] = count;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				System.out.printf("%03d", arr[i][j]);
				if (j != n - 1)
					System.out.print(",");
			}
			System.out.println();
		}
	}
	/*題目:[C_AR40-易] 螺旋矩陣
    作者:1010
    時間:西元 2017 年 2 月 */
}