我在学校的计算机科学课上有一个家庭作业,其中我们必须打印出以下随机大小(宽度、高度)的图案。
..............................X..............................
..................................X..........................
.......................................X.....................
...........................................X.................
...............................................X.............
...................................................X.........
......................................................X......
........................................................X....
..........................................................X..
...........................................................X.
............................................................X
...........................................................X.
..........................................................X..
........................................................X....
......................................................X......
...................................................X.........
...............................................X.............
...........................................X.................
.......................................X.....................
..................................X..........................
..............................X..............................
..........................X..................................
.....................X.......................................
.................X...........................................
.............X...............................................
.........X...................................................
......X......................................................
....X........................................................
..X..........................................................
.X...........................................................
X............................................................
.X...........................................................
..X..........................................................
....X........................................................
......X......................................................
.........X...................................................
.............X...............................................
.................X...........................................
.....................X.......................................
..........................X..................................
..............................X..............................
考虑到大部分内容都是硬编码的,我几乎 100% 确定我的处理方式是错误的。我花了几个小时思考解决这个问题的不同方法。我试图找到一条曲线公式,但我终其一生都找不到一个完美拟合的公式。另外,即使我确实有一个公式,我也不知道如何在打印到控制台时实现它。我的代码当前仅打印固定尺寸的图案。
我的代码:
String pattern = "X";
String background = ".";
for(int i = 31; i < 61; i += 0) {
String output = "";
for(int j = 0; j < 61; j++) {
if(j == i) {
output += pattern;
} else {
output += background;
}
}
output = output.substring(2);
System.out.println(output);
if(i == 35) i += 5;
else if(i > 30 && i < 52) i += 4;
else if(i == 52) i += 3;
else if(i >= 55 && i < 59) i += 2;
else i++;
}
for(int i = 59; i >= 31; i += 0) {
String output = "";
for(int j = 0; j < 61; j++) {
if(j == i) {
output += pattern;
} else {
output += background;
}
}
output = output.substring(2);
System.out.println(output);
if(i <= 59 && i >= 57) i -= 2;
else if(i == 55) i -= 3;
else if(i <= 52 && i > 40) i -= 4;
else if(i == 40) i -= 5;
else i -= 4;
}
for(int i = 27; i >= 0; i += 0) {
if(i <= 1) break;
String output = "";
for(int j = 0; j < 61; j++) {
if(j == i) {
output += pattern;
} else {
output += background;
}
}
output = output.substring(2);
System.out.println(output);
if(i == 31) i -= 4;
else if(i == 27) i -= 5;
else if(i == 10) i -= 3;
else if(i <= 7 && i >= 5) i -= 2;
else if(i <= 5) i--;
else i -= 4;
}
for(int i = 3; i <= 31; i += 0) {
String output = "";
for(int j = 0; j < 61; j++) {
if(j == i) {
output += pattern;
} else {
output += background;
}
}
output = output.substring(2);
System.out.println(output);
if(i >= 3 && i <= 5) i += 2;
else if(i == 7) i += 3;
else if(i >= 10 && i <= 18) i += 4;
else if(i == 22) i += 5;
else i += 4;
}
显然,我的方法是低效且不正确的。我不希望为我输入代码,但非常感谢一些为我指明正确方向的伪代码。
最佳答案
你展示的图案让我想起sinusoid 。
虽然我的正弦波打印机与原始输出不 100% 匹配,但它可以让您知道从哪里开始。您可以尝试旋转并连接多个parabolas或您想到的其他数学函数的图表,或者使用下面的示例来获得您需要的内容。
示例
以下代码片段依赖于 Math.sin
函数打印“X”(请注意,它使用以弧度表示的角度作为参数):
// Configurations
Integer DEFAULT_ROW_LEN = 61;
Integer NUMBER_OF_ROWS = 1000;
char DEFAULT_ROW_CONTENT = '.';
Double SPEED = 2.8;
// Preparing row of dots
StringBuilder row = new StringBuilder();
for (int i = 0; i < DEFAULT_ROW_LEN; i++) {
row.append(DEFAULT_ROW_CONTENT);
}
for (int i = 0; i < NUMBER_OF_ROWS; i += SPEED) {
// Loop progress
double relativeProgress = i / DEFAULT_ROW_LEN.doubleValue();
// In projection on a circle
double circleProgress = relativeProgress * Math.PI * 2;
// Remember that sin goes from -1 to +1, but we need to fit the curve within 0 to +1
double consoleProgress = (Math.sin(circleProgress) + 1) / 2;
// Exact index in the row to highlight
int exactPosition = (int) (consoleProgress * DEFAULT_ROW_LEN);
row.setCharAt(exactPosition, 'X');
// Print current progress and restore defaults
System.out.println(row);
row.setCharAt(exactPosition, DEFAULT_ROW_CONTENT);
}
输出
..............................X..............................
....................................X........................
..........................................X..................
................................................X............
....................................................X........
........................................................X....
...........................................................X.
............................................................X
............................................................X
...........................................................X.
.........................................................X...
.....................................................X.......
.................................................X...........
............................................X................
......................................X......................
................................X............................
.........................X...................................
...................X.........................................
..............X..............................................
.........X...................................................
.....X.......................................................
..X..........................................................
X............................................................
X............................................................
X............................................................
..X..........................................................
......X......................................................
..........X..................................................
...............X.............................................
.....................X.......................................
...........................X.................................
.................................X...........................
关于java - 给定随机尺寸,如何将某种图案打印到控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714400/