在某些形状中显示数字

时间:2018-05-30 09:52:22

标签: java

我刚刚在15分钟前就想到了这个问题,尽管看起来非常容易,但是我遇到了一个严重的问题。

基本上我想做的是基于用户给出的数字(n),我想画一个方形。

示例:假设用户给出数字2,结果应为:

12
43

现在,假设用户给出数字3,结果应为:

123
894
765

等。

请不要给我这个问题的解决方案,我只是想要一两条线索让我离开。

我想过用一个简单的java类来做这件事,但我仍然在努力克服第一个条件:

public class DrawSquareWithNumbers {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter your number: ");
        int number = scanner.nextInt();

        for (int i = 0; i <= number; i++) {
            if (i<number)
             System.out.print(i); 
             if (i>=number) {
                 System.out.println("\n"+i);
             }
        }

    }
}

任何提示?提前谢谢。

4 个答案:

答案 0 :(得分:1)

我想你想用用户输入的号码制作nxn矩阵。所以你可以检查输入然后你可以使用循环(i = 1; i <= n; i ++)用于行,类似地用于列(对于j = 0; j <= n; j ++)然后你可以打印你想要的形状。因为你只是要求你提出想法,所以我不在这里发布任何代码。如果您遇到困难,可以参考:https://www.google.com/amp/s/www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/amp/

答案 1 :(得分:1)

好的,让我们试一试。首先让我们假设您必须在打印矩阵之前存储矩阵,并且没有神奇的公式允许您在一次迭代中打印所需的内容。

现在,您已经使用了NxN矩阵,例如3,它是3x3,9个位置。您可以使用方向向量来获得更清晰的解决方案,而不是以丑陋的方式使用一系列ifs来解决它。现在假设您还有另一个填充了布尔值的NxN矩阵,所有矩阵都设置为false,这将表示您将在最后打印的NxN矩阵中已经打印的位置。在最终的NxN矩阵中写入数字时,在布尔矩阵中将相同位置的布尔值设置为true。

因此,例如,您要打印第一行的位置,1 2 3.您将移动到右侧进行打印。这是方向(1,0),也就是起始方向向量。使用此坐标前进NxN矩阵。当你走出矩阵(在这个例子中,你的x位置是3)时,你将x位置减1,然后旋转&#34;你的方向向量(这应该在一个单独的函数中完成)。 (1,0)会旋转到(0,-1)。你继续使用这个向量来迭代你的矩阵,按需要旋转。在第一个整圆后,您将在走出矩阵之前到达已打印的位置。因此,在每次打印之后,您不仅要检查是否超出矩阵,还要检查该位置是否已有数字。为此,您使用布尔矩阵。

这就是我解决它的方式,可能有很多其他方式(以及更好的方法)。对于初学者,你可以在最终矩阵中使用null或mark,并为自己保留一个布尔值。

答案 2 :(得分:1)

所以我觉得我只是花了太多时间,但这是一个有趣的挑战,所以我想让我们试一试。

我为这个解决方案实现了一个代码版本并且它工作得很好,尽管它可能不是最干净的,因为我向后解决了整个问题。

这是我在网上尝试的解决方案(注意它是严格未经优化的,并且没有任何好的Java代码。说实话,这是一个快速而肮脏的实现):

  

https://ideone.com/97JB7Y

所以这个想法非常简单:我们首先计算矩阵中每个位置的正确值,然后打印出矩阵。

让我们更详细地介绍一下:

我们首先为要打印的值创建矩阵:

对于给定的尺寸n,这是

int[][] values = new int[n][n];

现在我们想要计算每个点的正确值。我选择以“错误的方式”解决它,不是从第一点开始,而是从螺旋的中心开始。

基本上想象这个矩阵有n = 3

[1][2][3]
[8][9][4]
[7][6][5]

而不是1我只是从9开始。对此的推理是,实际上更容易计算从螺旋上升到某一点的位置。

所以从这个中心点开始,我们以循环的方式从那里开始。对于矩阵

[1][2]
[4][3]

这意味着我们访问了4 - &gt; 3 - &gt; 2 - &gt; 1.然后只需在矩阵中保存正确的值。

我的方法唯一的问题是,对于尺寸不均匀的矩阵(3,5,7等),我仍然以螺旋顺序访问这些点,对于3x3,访问的顺序是例如9 - &gt; 4 - &gt; 3 - &gt; 2 - &gt; 1 - &gt; 8 - &gt; 7 - &gt; 6 - &gt; 5,在这张完美画面中可视化我完全画了画:

Order of Evaluation

这导致结果矩阵反转:

[5][6][7]
[4][9][8]
[3][2][1]

这个小问题很容易修复,只需再次打印出矩阵,n%2 != 0即可。

希望我可以帮助解决这个问题。

答案 3 :(得分:0)

  • 预先创建结果矩阵,并声明当前数字的变量,起始值= 1,当前坐标,从(0,0)开始,步进方向以&#34开头;右边&# 34;
  • 开始循环
  • 计算下一步的坐标,并进行检查
  • 如果它不在矩阵中,则改变方向,然后重新计算,重新检查
  • 如果有空,则将数字放在矩阵中,递增,然后循环
  • 如果它不是免费的,则结束循环,打印输出结果矩阵