创建N×N字母网格,使两个相邻的字母不相同

时间:2013-03-22 17:09:23

标签: java

我需要打印出一个包含字母A到F的N×N网格,这样就不会有两个相邻的字母相同。下面的代码打印出N×N网格,但是我只能得到左边和右边的字母不同。我找不到让上下字母也有所不同的方法。我需要在不使用数组的情况下解决这个问题。这些信件必须随机化。

public static void main(String[] args) {
    int N = StdIn.readInt();
    for (int column = 0; column < N; column++) {
        int x = 0;

        for (int row = 0; row < N; row++) {

            int c = (int) (Math.random() * 6 + 1);

            while (x == c) {
                c = (int) (Math.random() * 6 + 1);
            }
            if (c == 1) {
                System.out.print("A ");
            }
            if (c == 2) {
                System.out.print("B ");
            }
            if (c == 3) {
                System.out.print("C ");
            }
            if (c == 4) {
                System.out.print("D ");
            }
            if (c == 5) {
                System.out.print("E ");
            }
            if (c == 6) {
                System.out.print("F ");
            }

            x = c;

        }

        System.out.println();

    }

3 个答案:

答案 0 :(得分:0)

我帮你简化了你的for循环

for (int row = 0; row < N; row++) {
  char c = (char) (Math.random() * 6 + 'A');
  while (x == c) {
    c = (char) (Math.random() * 6 + 'A');
  }
  System.out.print(c + " ");
  x = c;
}

使用字母的ASCII值,因此您不需要大的if语句。

您的问题不清楚允许哪种存储格式,但请考虑以下因素: 如果你可以将每一行存储为一个字符串(一个临时字符串在移动一行后被删除),你如何检查你在其下面构建的行中的字母是否与上面的字母匹配?将字符串视为数组(这是它的真实形式)。

答案 1 :(得分:0)

轻松完成2个队列。

如果你分析下面的内容,你应该意识到你真的只需要一个N级链表。

current是当前行,每个新元素都只是入队。

last是上一行。完成一行后,它会取current的值,然后我们要检查的第一个元素位于前面。

我将第一行与其他行分开,以使事情更简单,更容易理解。

  int N = 10;
  Queue<Character> last,
                   current = new Queue<Character>();
  char prev = '0';
  for (int row = 0; row < N; row++)
  {
     char c;
     do { c = (char)(Math.random() * 6 + 'A'); }
     while (prev == c);
     current.enqueue(c);
     prev = c;
     System.out.print(c + " ");
  }
  System.out.println();
  for (int col = 1; col < N; col++)
  {
     last = current;
     current = new Queue<Character>();
     prev = '0';
     for (int row = 0; row < N; row++)
     {
        char c;
        do { c = (char)(Math.random() * 6 + 'A'); }
        while (last.peek() == c || prev == c);
        current.enqueue(c);
        last.dequeue();
        prev = c;
        System.out.print(c + " ");
     }
     System.out.println();
  }

答案 2 :(得分:0)

您可以使用一对堆栈和候选字符来执行此操作。 NxN网格由最多包含N个N个字符的堆栈表示。尝试使用一副卡片,堆栈由两个卡片堆栈代表,以了解它是如何工作的。

  1. 创建两个堆栈,A和B.为A中的项目数保留一个运行索引。
  2. 生成一个随机数。这是你的候选人。
  3. 如果堆栈A中有多个N项(您刚刚完成一行),请跳至步骤6.
  4. 弹出堆栈A的顶部并将其存储为Check。
  5. 是否在候选人附近检查?如果是,请将Check检回到堆栈A,然后返回步骤2.(null不相邻)
  6. 将支票推入堆栈B.弹出N-2个项目,然后将它们推到堆栈B上。
  7. 弹出堆栈A的顶部并将其存储为Check。 (堆栈B中应该有N-1个项目,检查中应该有一个项目:整行)
  8. 是否在候选人附近检查? (null不相邻)如果是,请按“检查”返回到堆栈A,弹出堆栈B中的每个项目,然后按顺序推入堆栈A,然后返回步骤2.
  9. 将支票推回堆栈A.从堆栈B中弹出每个项目,然后按顺序推入堆栈A.
  10. 将候选人推入堆栈A。
  11. 增加索引。如果我们现在在堆栈A中有NxN项目,我们就完成了:将所有内容从堆栈A中弹出,然后将它们写入NxN网格中。否则返回第2步。
  12. 基本上,您正在绘制一张卡片,并检查最多两件物品。因为堆栈A保证永远不会有相邻的内容,所以一旦放置了一个项目,就不必删除它。所以一旦你走到尽头,你就完成了。