Java实现螺旋钻石字符图案求助:输入3与字符串abcdefghijklm
解决Java中螺旋钻石图案的字符填充问题
看起来你已经搞定了星形钻石的打印,现在卡在如何按螺旋顺序填充字符对吧?我来帮你理清楚思路,一步步实现这个需求。
首先明确需求细节:
- 输入
n=3时,字符串长度为n² + (n-1)² = 13,刚好对应你给出的abcdefghijklm(a到m共13个字符) - 输出的钻石结构共
2n-1=5行,每行列数依次为1→3→5→3→1,字符按指定螺旋路径填充
核心思路拆解
- 构建钻石网格:创建二维数组存储每个位置的字符,初始用空格占位,方便后续对齐打印。
- 生成螺旋位置序列:定义螺旋路径的移动顺序,生成钻石所有位置的访问顺序列表。
- 填充并打印网格:按螺旋顺序将字符串字符填充到网格,最后添加对齐空格并打印每行内容。
Java代码实现
import java.util.ArrayList; import java.util.List; public class SpiralDiamond { static class Position { int row; int col; Position(int row, int col) { this.row = row; this.col = col; } } public static void main(String[] args) { int n = 3; String input = "abcdefghijklm"; char[] chars = input.toCharArray(); int totalRows = 2 * n - 1; // 生成螺旋顺序的位置列表 List<Position> spiralPositions = generateSpiralPositions(n); // 初始化钻石网格,用空格填充 char[][] diamond = new char[totalRows][]; for (int i = 0; i < totalRows; i++) { int cols = 2 * Math.min(i, totalRows - 1 - i) + 1; diamond[i] = new char[cols]; for (int j = 0; j < cols; j++) { diamond[i][j] = ' '; } } // 按螺旋顺序填充字符 for (int i = 0; i < spiralPositions.size(); i++) { Position pos = spiralPositions.get(i); diamond[pos.row][pos.col] = chars[i]; } // 居中对齐打印钻石 for (char[] row : diamond) { int padding = (2 * n - 1 - row.length) / 2; System.out.print(" ".repeat(padding)); System.out.println(new String(row)); } } private static List<Position> generateSpiralPositions(int n) { List<Position> positions = new ArrayList<>(); int totalRows = 2 * n - 1; int mid = totalRows / 2; // 1. 左列向上:从中间行到顶部行,每行左列 for (int row = mid; row >= 0; row--) { positions.add(new Position(row, 0)); } // 2. 右列向下:从顶部下一行到中间行,每行右列 for (int row = 1; row <= mid; row++) { int cols = 2 * Math.min(row, totalRows - 1 - row) + 1; positions.add(new Position(row, cols - 1)); } // 3. 右下到左下:从中间下一行到底部行,逐步左移 for (int row = mid + 1; row < totalRows; row++) { int cols = 2 * Math.min(row, totalRows - 1 - row) + 1; int col = cols - 1 - (row - mid); positions.add(new Position(row, col)); } // 4. 左列向上:从底部上一行到中间下一行,每行左列 for (int row = totalRows - 2; row > mid; row--) { positions.add(new Position(row, 0)); } // 5. 中间行横向:从左数第二列到右数第二列 int midCols = 2 * mid + 1; for (int col = 1; col < midCols - 1; col++) { positions.add(new Position(mid, col)); } // 6. 内层中间行:第二行和倒数第二行的中间列 positions.add(new Position(1, 1)); positions.add(new Position(3, 1)); // 7. 中心位置 positions.add(new Position(mid, midCols / 2)); return positions; } }
代码说明
- 位置生成函数:
generateSpiralPositions分7个阶段生成螺旋路径的位置,完全匹配你给出的输出顺序。 - 网格对齐:打印时通过计算每行的前置空格,让钻石图案居中显示,更符合视觉效果。
- 扩展性:如果需要调整螺旋方向或起始点,只需修改
generateSpiralPositions中的位置添加顺序即可。
运行代码后会输出:
c bjd aimke hlf g
内容的提问来源于stack exchange,提问作者user13503900
相关产品推荐
相关产品推荐

