无法解析特定图案生成逻辑,寻求Java图案打印代码指导
解析目标图案逻辑并修正Java代码
首先,我们先明确你给出的目标图案(以N=4为例)的结构,把空白替换为要求的'-'后,完整图案应该是:
---/ --/- -/-/\ -/--\ \--/ \-/- -/-\ \/
(注:每行长度匹配外臂N个'-'的要求,左右两侧的'-'总数为N)
你的现有代码只处理了单斜线的生成逻辑,但目标图案从第3行开始出现双斜线,且斜线位置有展开和收起的对称规律,我们可以把整个图案分成4个阶段来实现:
阶段1:上半部分单斜线(行0 ~ 行1)
这两行只有一个/,位置逐行左移:
- 行号
i(从0开始),/的列位置为N-1 - i - 其他位置填充
'-'
阶段2:上半部分双斜线展开(行2 ~ 行N-1)
这两行出现两个/和一个\,规律是:
- 第一个
/的列位置:N-1 - (i-1)→ 保持和阶段1的最后一行左移位置一致 - 第二个
/的列位置:第一个/的位置 +1 \的列位置:N-1 + (i-1)→ 逐行右移,实现展开效果- 其他位置填充
'-'
阶段3:下半部分双斜线收起(行N ~ 行N+1)
这两行是阶段2的对称镜像,用\代替/,/代替\:
- 第一个
\的列位置:(i - N) +1→ 逐行右移 - 第二个
\的列位置:第一个\的位置 +1 /的列位置:2*N -1 - (i - N)→ 逐行左移,对应阶段2的\位置- 其他位置填充
'-'
阶段4:下半部分单斜线收起(行N+2 ~ 行2N-1)
这两行是阶段1的对称镜像,用\和/组合:
\的列位置:(i - N) +1→ 逐行右移/的列位置:\的位置 +1- 其他位置填充
'-'
修正后的Java代码
import java.util.Scanner; public class PatternPrinter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("输入数字N:"); int N = scanner.nextInt(); int totalRows = 2 * N; for (int i = 0; i < totalRows; i++) { // 初始化当前行的字符数组,默认填充'-' char[] row = new char[2 * N]; for (int j = 0; j < 2 * N; j++) { row[j] = '-'; } if (i < 2) { // 阶段1:上半部分单斜线 int slashCol = N - 1 - i; row[slashCol] = '/'; } else if (i < N) { // 阶段2:上半部分双斜线展开 int firstSlashCol = N - 1 - (i - 1); int secondSlashCol = firstSlashCol + 1; int backslashCol = N - 1 + (i - 1); row[firstSlashCol] = '/'; row[secondSlashCol] = '/'; row[backslashCol] = '\\'; } else if (i < N + 2) { // 阶段3:下半部分双斜线收起 int offset = i - N; int firstBackslashCol = offset + 1; int secondBackslashCol = firstBackslashCol + 1; int slashCol = 2 * N - 1 - offset; row[firstBackslashCol] = '\\'; row[secondBackslashCol] = '\\'; row[slashCol] = '/'; } else { // 阶段4:下半部分单斜线收起 int offset = i - N; int backslashCol = offset + 1; int slashCol = backslashCol + 1; row[backslashCol] = '\\'; row[slashCol] = '/'; } // 打印当前行,trim匹配你给出的图案无末尾'-'的效果,保留所有'-'可去掉trim() System.out.println(new String(row).trim()); } scanner.close(); } }
代码说明
- 我们用字符数组构建每行,先默认填充
'-'再替换对应位置的斜线,逻辑更清晰易维护。 - 每个阶段的位置计算都基于行号
i和输入N的关系,保证图案的对称性和展开/收起的动态效果。 - 若需要严格保留所有外臂的
'-'(不删除末尾空白),直接去掉trim()方法即可。
内容的提问来源于stack exchange,提问作者Diwakar Bhatt
相关产品推荐
相关产品推荐

