Javaで数字のスパイラルパターンを出力する方法をわかりやすく解説
はじめに
この記事では、Javaで数字のスパイラルパターン(渦巻き状に数字が並ぶ模様)をコンソールに出力する方法を解説します。複雑に見えますが、ポイントはたった一つの計算式と二重のforループだけです。仕組みを理解すれば、好きなサイズのパターンを自由に生成できるようになります。
実行結果のイメージ
サイズとして「5」を入力すると、次のような9×9のパターンが出力されます。
入力:
Enter the size : 5
出力:
The spiral pattern 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 5 5 4 3 3 3 3 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 2 1 2 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 3 3 3 3 4 5 5 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
中心が「1」になり、外側に向かって数字がひとつずつ大きくなり、最も外側の枠が入力値と一致する構造になっています。
アルゴリズム
処理の流れは以下の通りです。
- 処理を開始します。
- 整数型の変数 i、j、my_pattern_size、my_input を宣言します。
- ユーザーからサイズを入力してもらうか、あらかじめ値を定義します。
- パターンの一辺の長さ my_pattern_size に「2 × my_input − 1」を代入します(入力が5なら9×9の正方形になります)。
- 外側の for ループで行を、内側の for ループで列を順に処理します。
- 各マスの値を「Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1」で計算して出力します。
- 一行分の出力が終わるごとに改行します。
- すべての行を出力したら処理を終了します。
パターンが生まれる仕組み
このプログラムの核心は、次の一行の式です。
Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1
- Math.abs(i - my_input) … 現在の行が中心の行からどれだけ離れているか(行方向の距離)
- Math.abs(j - my_input) … 現在の列が中心の列からどれだけ離れているか(列方向の距離)
- Math.max(...) … 2つの距離のうち大きい方を採用します
- + 1 … 中心の値を「1」に合わせるための調整です
つまり各マスには「中心からの距離+1」が入るため、中心を1、その周囲を2、さらにその外側を3……というように、正方形の輪が何重にも重なったスパイラル模様が自動的に描かれます。if文による条件分岐が一切不要な、非常にエレガントな手法です。
例1:ユーザーの入力を受け付ける場合
Scannerクラスを使い、実行時にサイズをキーボードから入力する例です。
import java.util.Scanner;
import java.lang.Math;
public class SpiralPattern {
public static void main(String args[]) {
int my_input, i, j, my_pattern_size;
Scanner my_scanner = new Scanner(System.in);
System.out.print("Enter the size : ");
my_input = my_scanner.nextInt();
System.out.println("The spiral pattern ");
my_pattern_size = 2 * my_input - 1;
for(i = 1; i <= my_pattern_size; i++) {
for(j = 1; j <= my_pattern_size; j++) {
System.out.print(Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1 + " ");
}
System.out.println();
}
}
}
出力
Enter the size : 5 The spiral pattern 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 5 5 4 3 3 3 3 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 2 1 2 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 3 3 3 3 4 5 5 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
例2:値を事前に定義する場合
入力処理を省き、サイズをコード内で固定する例です。動作確認や学習用途に便利です。
import java.lang.Math;
public class SpiralPattern {
public static void main(String args[]) {
int my_input = 5;
int i, j, my_pattern_size;
System.out.println("The size is defined as " + my_input);
System.out.println("The spiral pattern ");
my_pattern_size = 2 * my_input - 1;
for(i = 1; i <= my_pattern_size; i++) {
for(j = 1; j <= my_pattern_size; j++) {
System.out.print(Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1 + " ");
}
System.out.println();
}
}
}
出力
The size is defined as 5 The spiral pattern 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 5 5 4 3 3 3 3 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 2 1 2 3 4 5 5 4 3 2 2 2 3 4 5 5 4 3 3 3 3 3 4 5 5 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
まとめ
数字のスパイラルパターンは、「中心からの距離+1」を各マスに当てはめるだけで描画できます。Math.absで距離を求め、Math.maxで行・列の距離の大きい方を選ぶ――この発想を覚えておけば、ひし形や円環状の模様など、同種のパターン出力問題にも応用できます。ぜひ入力値を変えながら、さまざまなサイズのパターンを試してみてください。
-
C言語で数字をスパイラル(蛇行)パターンで表示するプログラム
はじめに本記事では、C言語を使って数字をスパイラル(蛇行)パターンで表示する方法を解説します。このパターンの特徴は、行ごとに数字の並び順が交互に入れ替わり、蛇が這うように数字が連なっていく点です。出力イメージ作成するパターンは以下のようになります。 1 2 4 3 5 6 8 7 9 10 12 11ロジックの解説数字をスパイラルパターンで表示するために使用するロジックは以下の通りです。for(i=1;i<=rows*2;i+=2){ if(k%2==1){ &nb
-
Cプログラムで行列を対角パターンに沿って数値出力する方法
この課題は、n×nの行列を対角パターンで出力することです。 例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。 そして、実際の出力結果は以下の通りです。 実行例 Input: 3 Output: 1 2 4 3 5 7 6 8 9 Input: 4 Output: 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 考え方 一見すると、「数値 n を受け取り n×n の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます