我需要打印出一个包含字母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();
}
答案 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个字符的堆栈表示。尝试使用一副卡片,堆栈由两个卡片堆栈代表,以了解它是如何工作的。
基本上,您正在绘制一张卡片,并检查最多两件物品。因为堆栈A保证永远不会有相邻的内容,所以一旦放置了一个项目,就不必删除它。所以一旦你走到尽头,你就完成了。