我需要为每个三角形制作一个包含3行数的三元组

时间:2014-11-11 14:53:38

标签: java println

  

每一行都是相同的数字,而在所有三个三角形中,数字是相同的。

     

输入:

     
      
  • 第一行包含一个整数n,表示要遵循的数据集数。
  •   
  • 每个数据集将包含1个整数m,表示整个勇气的Triforce包含的数字。
  •   
     

输出:

     

使用此模板打印出一个小部件(用指定的整数替换0):

     0
    000
   00000
  0     0
 000   000
00000 00000
     

假设:要替换的数字将是:0 <= m <= 9

     

示例输入:   1   2

     

示例输出:

     2
    222
   22222
  2     2
 222   222
22222 22222

以下是我目前的代码:

import java.lang.Math;
import java.util.Scanner;
import java.io.*;
import java.util.*;
import java.io.FileNotFoundException;

public class TriforceOfCourage {
     public static void main(String[] args) throws FileNotFoundException {
        Scanner scan=new Scanner(new File("num.dat"));
        int n = scan.nextInt();
        int count = 0;
        while(count<n) {
            for (int i=0; i<3; i++) {
                for (int k=0; k<3-i; k++) {
                    System.out.print(" ");
                }
                for (int j=0; j<i*2+1; j++) {
                    System.out.print(n);
                }
                System.out.println("");
            }
            break;
        }
    }
}

3 个答案:

答案 0 :(得分:7)

这个问题有很多可能的解决方案。一般来说,您通常会使用许多好的策略来解决这个问题:

  1. 寻找一种模式。你能找到一种可以通过逻辑和代数运算轻松表达的模式吗?
  2. 问题可以分解为更小,更易于管理的部分吗?有时看似复杂的问题可以分成更小,更简单的问题。
  3. 如有疑问,请在纸上解决问题。
  4. 让我们举个例子吧。一眼就看,我个人将输出分成两半;顶部由一个三角形组成,底部由两个三角形并排组成。此外,让我们专注于能够绘制三角形。假设我们想要在任意位置生成三角形:

                11
      012345678901
     0       x
     1      xxx
     2     xxxxx
    

    我们注意到三角形位于第7列的中心位置,我们怀疑如果我们可以在任何列中绘制一个三角形,它会帮助我们,所以让我们让center成为我们的三角形很多这些类型的策略都涉及到参数化问题的方法。对于这种方法,我们希望找到这个问题的答案:

    • 鉴于rowcolumncenter,我们应该在该位置绘制一个角色吗?

    我们首先采用一种简单的代数方法,一次一行,看看我们是否注意到任何模式:

    • row == 0:此处我们仅在column == center
    • 时输出
    • row == 1:我们在column >= center - 1 && column <= center + 1时输出。
    • row == 2:我们在column >= center - 2 && column <= center + 2时输出。

    注意一个模式?想想它一秒钟。认识到row == 0不是实际特殊情况,模式是:

    • column >= center - row && column <= center + row时的输出。

    大!现在我们可以很容易地输出一个三角形:

    int center = 7; // From our example.
    
    for (int row = 0; row < 3; ++ row) {
        for (int column = 0; column < 11; ++ column) {
            if (column >= center - row && column <= center + row)
                System.out.print("x"); // Replace with whatever character to print.
            else
                System.out.print(" ");
        }
        System.out.println(); // Line break after each row, of course.
    }
    

    但是对于下半部分,两个三角形呢?最简单的当然是与上面完全相同,但由于我们有两个三角形,我们有两个中心(比如,centerLcenterR),并且可以简单地添加第二个{{1在我们的下半部分循环中阻塞 - 两个中心的逻辑相同,都在一个循环中。我会把这作为练习留给你。

    现在,就像我说的,有很多可能的解决方案。选择最适合您的那个,最容易让您满意。事实上,作为一个学习练习,我建议尝试用至少三种不同的算法来实现这个程序。例如:

    • 遍历所有6行(而不是上半部分和下半部分)并将所有3个三角形放在同一个循环中。
    • 创建一个2D数组并将三角形绘制到中,然后输出内容。
    • 尝试实现上述内容而不使用if(例如从if输出到center - row的循环,并为边框分隔循环) - 这与您当前的方法类似
    • 尝试创建一个方法,可以绘制任何高度的三角形,而不仅仅是3。
    • 尝试创建一个可以绘制任何“三角形三角形”的方法,例如3,4,5行三角形。

    当然,

    enter image description here

答案 1 :(得分:2)

正如所承诺的那样,我将发布我的解决方案。感谢MR。杰森我能够解决这个问题,现在我需要稍微修改一下它从文件中读取的数字,但我可以轻松理解。

 // By Rexhep Rexhepi
 // 11/12/14
 // BIG THANKS TO MR. Jason!
 import java.lang.Math;
 import java.util.Scanner;
 import java.io.*;
 import java.util.*;
 import java.io.FileNotFoundException;

 public class TriforceOfCourage
 {

     public static void main(String[] args) throws FileNotFoundException
         {

            Scanner scan=new Scanner(new File("num.dat"));
            int n = scan.nextInt();
            int count = 0;
            int center = 5;
            int centerL = 2;
            int centerR = 8;

             for (int row = 0; row < 3; ++ row)
                 {
        for (int column = 0; column < 11; ++ column)
                {
            if (column >= center - row && column <= center + row)
                System.out.print("x"); // Replace with whatever character to print.
            else
                System.out.print(" ");
                }
        System.out.println(); // Line break after each row, of course.
            }

        for(int rowB = 0; rowB < 3; rowB++)
        {
        for (int columnL= 0;columnL < 5; columnL++)
        {
            if (columnL>= centerL - rowB && columnL <= centerL + rowB)
                System.out.print("x");
                else
                    System.out.print(" ");
        }
        for (int columnR = 5; columnR<11; columnR++)
        {
            if (columnR>= centerR-rowB && columnR <= centerR+rowB)
                System.out.print("x");
                else
                    System.out.print(" ");
        }
        System.out.println();
        }

} }

答案 2 :(得分:-3)

在下面的代码triforce(...)中将打印所需的输出。

public void triforce(int n, int m) {
    triangleWithSpaces(2, 1, n, m);
    triangleWithSpaces(2, 2, n, m);
}

public void triangleWithSpaces(int s, int t, int n, int m) {
    for (int i = 0; i <= n; i++) {
        for (int k = 0; k < t; k++) {
            for (int j = 0; j < ((n * 2 + 1) / 2 + 1) * (s - t); j++) {
                System.out.print(" ");
            }
            for (int j = n - i; j > 0; j--) {
                System.out.print(" ");
            }
            for (int j = 0; j < i * 2 + 1; j++) {
                System.out.print(m);
            }
            for (int j = n - i; j > 0; j--) {
                System.out.print(" ");
            }
            System.out.print(" ");
        }
        System.out.println();
    }
}

示例运行

triforce(2,0);

     0  
    000 
   00000
  0     0  
 000   000 
00000 00000

triforce(3,9);

       9    
      999   
     99999  
    9999999 
   9       9    
  999     999   
 99999   99999  
9999999 9999999