繁体   English   中英

我需要制作一个Triforce,每个三角形包含3条数字

[英]I need to make a triforce containing 3 lines of number for each triangle

每行是相同的编号,并且在所有三个三角形中,该编号是相同的。

输入:

  • 第一行包含一个整数n,代表要跟随的数据集的数量。
  • 每个数据集将由1个整数m组成,该整数表示Triforce of Courage始终包含的数字。

输出:

使用以下模板打印出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;
        }
    }
}

有许多可能的解决方案来解决此问题。 通常,通常可以使用许多好的策略来解决此问题:

  1. 寻找模式。 您是否可以找到可以通过逻辑和代数运算轻松表达的模式?
  2. 问题可以分解为更小,更易于管理的部分吗? 有时,看似复杂的问题可以分为更小的,非常简单的问题。
  3. 如有疑问,请在纸上解决。

让我们举个例子。 乍一看,我个人将输出分为两半。 顶部由一个三角形组成,底部由两个三角形并排组成。 此外,让我们专注于完全能够绘制一个三角形。 假设我们要在任意位置产生一个三角形:

            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 ),并且可以在下半循环中简单地添加第二个if块-相同两个中心的逻辑,都在一个循环中。 我将把它作为练习留给您。

现在,就像我说的那样,有许多可能的解决方案。 选择对您来说最有意义,最容易动手的一种。 实际上,作为一项学习练习,我建议尝试使用至少三种不同的算法来实现该程序。 例如:

  • 循环所有6行(而不是上半部分和下半部分),并将所有3个三角形放在同一循环中。
  • 创建一个二维数组,并绘制三角形进去 ,然后输出的内容。
  • 尝试完全不使用if来实现上述功能(例如,从center - rowcenter + row循环,以及边界的单独循环)-这类似于您当前的方法。
  • 尝试创建一种可以绘制任意高度的三角形的方法,而不仅仅是3个。
  • 尝试创建一种可以绘制任何 “三角形三角形”的方法,例如3、4、5行三角形。

而且当然,

在此处输入图片说明

按照承诺,我将发布我的解决方案。 多亏了MR。 贾森(Jason)我能够解决此问题,现在我需要对其从文件中读取数字的位置进行一些细微修改,但我可以轻松理解。

 // 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();
        }

}}

在下面的代码中, 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM