【问题标题】:Reversing a nested loop反转嵌套循环
【发布时间】:2012-11-08 01:16:06
【问题描述】:

我正在尝试反转此代码,以便可以打印带有边框的菱形。开始反转嵌套循环/一系列循环的最佳方法是什么?我尝试修改代码,但一切都变得混乱和无序。有什么建议吗?

另外,有没有办法在顶部星星的每一侧制作偶数个 .'s?我能够使它工作的唯一方法是在每一面打印一个均匀的数量......

这是应该打印到控制台的内容:http://i.imgur.com/h55r2.jpg

这是我的代码:

public class SixTester {

    public static void main(String[] args)
    {
            int i,j,k;
            int numOfRows = 8;  // Made this a variable, so that the program can make any size diamond (try playing around with different values eg. 2 or 16)

            // Step 1. The first Dash
            for(i=0;i<numOfRows*2 +2;i++)
                    System.out.print(" "); // Number of spaces is double the number of rows in your 'Half Pyramid'
            System.out.println("-");

            // Step 2. The First half diamond
            for (j=0; j<numOfRows ; j++ )
            {
                    for(k=numOfRows*2; k>1+j*2; k--)
                            System.out.print(" ");

                    System.out.print("_/");
                    for (i=0; i< 2+j*4; i++)
                    {
                            // Prepare the Star rectangle, Note that it starts half the way (rows/2)
                            if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) {
                                    System.out.print("*");                                 
                            }
                            else
                                    System.out.print(".");
                    }
                    System.out.println("\\_");
            }
            // Next Step  - Make the bottom pyramid...but how to reverse?
    }
}

【问题讨论】:

  • +1 用于拍摄 ascii 艺术照片
  • 我希望为每个 heavy 操作使用一种方法。我所说的重动作是指每个包含逻辑代码的for-loop。一旦您设计了这些方法,就更容易反转当前代码。否则,您应该只复制并调整当前代码以具有反向打印行为。

标签: java for-loop reverse shape nested-loops


【解决方案1】:

如果你写了一个这样的构建器......

public static interface Reflection {
    String reflect(String str);
}

public static class Builder {
    private List<String> lines = new ArrayList<String>();
    private StringBuilder builder = new StringBuilder();
    public void newLine() {
        lines.add(builder.toString());
        builder = new StringBuilder();
    }
    public void repeat(String section, int count) {
        for (int i = 0; i < count; i++) {
            builder.append(section);
        }
    }
    public void padLeft(String section, int count) {
        while (builder.length() < count) {
            builder.append(section, 0, section.length());
        }
    }
    public void reflectX(Reflection reflection) {
        List<String> reflected = new ArrayList<String>();
        for (String line : lines) {
            StringBuilder tmp = new StringBuilder();
            tmp.append(reflection.reflect(line));
            tmp.reverse();
            tmp.append(line);
            reflected.add(tmp.toString());
        }
        lines = reflected;
    }
    public void reflectY(Reflection reflect) {
        List<String> reflection = new ArrayList<String>();
        for (String line : lines) {
            reflection.add(reflect.reflect(line));
        }
        Collections.reverse(reflection);
        lines.addAll(reflection);
    }
    public String build() {
        StringBuilder tmp = new StringBuilder();
        for (String line : lines) {
            tmp.append(line);
            tmp.append('\n');
        }
        return tmp.toString();
    }
    public void write(String string) {
        builder.append(string);
    }
}

然后将您的代码代码简化为这样,但这只是过度工程:

int nRows = 8;
int pad = 20;
Builder builder = new Builder();

builder.write("_");
builder.padLeft(" ", pad);
builder.newLine();

for (int i = 0; i < nRows; i++) {
    int dots = i * 2 + 1;
    int stars = i >= 4 ? 4 : 0;
    builder.repeat("*", stars);
    builder.repeat(".", dots - stars);
    builder.write("\\");
    if (i < nRows - 1) {
        builder.write("_");
    }
    builder.padLeft(" ", pad);
    builder.newLine();
}
builder.reflectX(new Reflection() {
    @Override
    public String reflect(String str) {
        return str.replace('\\', '/');
    }
});
builder.reflectY(new Reflection() {
    @Override
    public String reflect(String str) {
        return str.replace("\\", "%x").replace("/", "\\").replace("%x", "/").
                replace("_\\", "%x").replace("/_", "_/").replace("%x", "\\_");
    }
});
System.out.println(builder.build());

结果

               __                   
             _/..\_                 
           _/......\_               
         _/..........\_             
       _/..............\_           
     _/.....********.....\_         
   _/.......********.......\_       
 _/.........********.........\_     
/...........********...........\    
\...........********.........../    
 \_.........********........._/     
   \_.......********......._/       
     \_.....********....._/         
       \_.............._/           
         \_.........._/             
           \_......_/               
             \_.._/                 
               __                   

【讨论】:

    【解决方案2】:

    这不是最优雅的方式,但它确实有效。在您的代码显示“但如何反转?”的位置插入这些行。我已经用 cmets 标记了对代码的更改

            // COUNT BACKWARDS NOW. YOU WANT LARGEST ROW FIRST, OTHERWISE IT'S OK EXCEPT...
            for (j=numOfRows-1; j>=0 ; j-- ) 
            {
                    for(k=numOfRows*2; k>1+j*2; k--)
                            System.out.print(" ");
    
                    System.out.print("\\_"); // BORDERS ARE BACKWARDS. PUT BORDER ON OTHER SIDE
                    for (i=0; i< 2+j*4; i++)
                    {
                            if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) {
                                    System.out.print("*");                                 
                            }
                            else
                                    System.out.print(".");
                    }
                    System.out.println("_/"); // PUT BORDER ON OTHER SIDE
            }
    
            for(i=0;i<numOfRows*2 +2;i++)
                    System.out.print(" ");
            System.out.println("-");
    

    【讨论】:

    • 我一直在寻找一些自己做这件事的技巧,但我想一开始就很模糊。感谢您的回答!我看到的唯一一个问题:我希望中心的星形矩形为 8x8,并且我需要更改底部金字塔中 . 的数量以匹配 this。非常感谢,+1!
    • 好吧,我很高兴我的解决方案并不完美,希望这能给您一些正确方向的提示。请记住,编程就是从小工作中构建大工作,如果你正确分析了修复大错误的小工作应该会容易得多。
    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2017-08-08
    • 2016-04-24
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多