0

我必须创建一个程序,将 9 行数独显示为 9 个 9 位数字,然后提示用户在数独上执行 6 个操作之一。然后我们必须在用户每次执行操作时输出数独。这是应该如何进行的示例运行:

Welcome to Sudoku Permuter.

   C C C C C C C C C
   1 2 3 4 5 6 7 8 9
R1 0 8 0 4 0 2 0 6 0
R2 0 3 4 0 0 0 9 1 0
R3 9 6 0 0 0 0 0 8 4
R4 0 0 0 2 1 6 0 0 0
R5 2 0 0 0 0 9 6 0 0
R6 0 1 0 3 5 7 0 0 8
R7 8 4 0 0 0 0 0 7 5
R8 0 2 6 0 0 0 1 3 0
R9 0 9 0 7 0 1 0 4 0

(0 denotes a blank)

Enter 1 to swap two rows in a panel
Enter 2 to swap two columns in a panel
Enter 3 to swap two row panels
Enter 4 to swap two column panels
Enter 5 to swap two numbers
Enter 0 to end:

假设用户输入 3(交换两个行面板)。这会出现:

Enter row panels (1-3) to swap: 3 1

它将交换行面板 1 和 3,这将是输出:

   C C C C C C C C C
   1 2 3 4 5 6 7 8 9
R1 8 4 0 0 0 0 0 7 5
R2 0 2 6 0 0 0 1 3 0
R3 0 9 0 7 0 1 0 4 0
R4 0 0 0 2 1 6 0 0 0
R5 2 0 0 0 0 9 6 0 0
R6 0 1 0 3 5 7 0 0 8
R7 0 8 0 4 0 2 0 6 0
R8 0 3 4 0 0 0 9 1 0
R9 9 6 0 0 0 0 0 8 4

Rows 1-3 have been switched with rows 7-9.

假设用户输入 5。这出现了:

Enter two numbers: 2 8

原来的数独再次输出,除了 2's 和 8's 在整个过程中切换。

   C C C C C C C C C
   1 2 3 4 5 6 7 8 9
R1 0 2 0 4 0 8 0 6 0
R2 0 3 4 0 0 0 9 1 0
R3 9 6 0 0 0 0 0 2 4
R4 0 0 0 8 1 6 0 0 0
R5 8 0 0 0 0 9 6 0 0
R6 0 1 0 3 5 7 0 0 2
R7 2 4 0 0 0 0 0 7 5
R8 0 8 6 0 0 0 1 3 0
R9 0 9 0 7 0 1 0 4 0

如果用户输入 1,就会出现一些提示

Enter two rows (1-9) to switch:

并且无论用户输入哪一行,这两个单独的行将被交换并且数独将再次被输出。如果用户输入 2,则类似,但会切换 2 列。类似地,如果用户输入 4,则会切换两个列面板。

我们应该使用这样的二维数组:

int [] [] sudoku = new int[10] [10]

我不知道该怎么做。我整个学期都在苦苦挣扎,这是我的第一堂编程课。我只是根本不懂数组,我也不明白我们一开始应该如何显示数独。这个问题不在我们的书中,所以我也没有什么可回顾的。我真的需要通过这门课。如果有人可以帮助我,我真的很感激。尽量让它易于理解,有很多东西我还没有学会如何去做(例如:为了记录,idk parseInt 是什么)。我试过读这本书(好几次)。它可以帮助一些人,但是这个程序是不可能的。十分感谢你的帮助。

4

2 回答 2

2
  1. 你知道如何读取输入吗?
  2. 您知道如何使用一维数组(列表),例如 {1, 2, 3, 4, 5}?
  3. 你了解for循环吗?
  4. 数组概念的哪一部分对您来说似乎很困难?

例如,这里有一段代码只打印出数组的原始内容。这段代码有意义吗?

int [] [] sudoku = new int[10] [10];
// loop through all of the rows
for (int row = 0; row < 10; row++) {
    // loop through all columns for each row
    for (int column = 0; column < 10; column++) {
        // print out the sudoku value at that row and column
        System.out.print(sudoku[row] [column] + " ");
    }
    // at the end of the row, print a blank line to start the next row
    System.out.println();
}

以下是如何对示例板进行硬编码以使用它:

int [] [] sudoku = new int [] [] {
    { 0, 8, 0, 4, 0, 2, 0, 6, 0 },
    { 0, 3, 4, 0, 0, 0, 9, 1, 0 },
    etc.
}

这是一些用于交换两行的伪代码。

Get first row # from user
Get second row # from user
Loop through each column in the board
    Swap(cell at first row #, current column, cell at second row #, current column)
End Loop

交换基本上需要一个临时变量来在交换时保存其中一个值:

Swap(a, b)
    Store a into Temp
    Store b into a
    Store Temp into b
于 2010-11-17T19:10:22.297 回答
0

正如 mellamokb 的评论所说,把事情分解成几部分是诀窍。乍一看,我可能会做这样的事情:

  1. 在数独板中进行硬编码,并制定例程将板打印出来
  2. 一旦一切正常,那么您将需要一个菜单​​。所以扩展你的程序来制作一个小菜单,打印回用户的选择,并且什么都不做
  3. 完成后,您可以开始填写菜单选项。因此,当用户选择选项一时,请执行交换两行的例程。其他菜单项仍然可以打印出它们的编号。

一旦你完成了这项工作,你实际上就差不多完成了。您可以从 #3 中获取您的例程,并通过小改动对其进行复制,以使其他 4 项修改成为可能。

你没有提到数独板的来源。如果它是硬编码的,你就完成了。如果没有,那么您所要做的就是制作该方法。至此,您已经知道可以正确打印板子、显示菜单和更换板子了。

您提到了数组的问题,它们可能有点飞跃。您是否有关于我们可以提供帮助的数组的具体问题?它们就像编程中的其他任何东西一样。您开始对它们一无所知,只是遵循您在其他地方找到的指导和代码。随着您获得更多经验(就像您将在这个项目和未来项目中一样),它们会变得不那么神秘并且更有意义,直到有一天它们像 3 + 7 一样简单。

于 2010-11-17T21:01:11.040 回答