我正在尝试制作一款名为“0hh1”的类似益智游戏的数独游戏,但我似乎总是陷入这一个问题。游戏不允许用户将相同颜色的三个连续正方形(有两种颜色,红色和蓝色)彼此相邻,但两个很好。此函数应检查行的任何两个相同颜色的连续方块,并在尚未填充的方块中写入相反的颜色(UNKNOWN正方形)。它应该在行的两个连续瓦片的两端写上卵形颜色,并且在行的两个相同颜色的瓦片之间的中间写。 mark_square_as()是为方块指定颜色的函数,每个板具有相同的行数和列数。
Example: ---- becomes ----
XX-- XXO-
-XX- OXXO
--X- --X-
其中X代表红色,O代表蓝色, - 未知
这是我的代码:
void solve_three_in_a_row(int board[MAX_SIZE][MAX_SIZE],
int size,
int row,
bool announce) {
for (int i = 0; i < size; i++) {
if (board[row][i] == 1 && board[row][i + 1] == 1) {
if (i + 1 == size - 1 && i - 1 >= 0 && board[row][i - 1] == UNKNOWN) {
mark_square_as(board, size, row, i - 1, 2, announce);
}
else if (i == 0 && i + 2 <= size && board[row][i + 2] == UNKNOWN) {
mark_square_as(board, size, row, i + 2, 2, announce);
}
else if (i - 1 >= 0 && i + 2 <= size && board[row][i - 1] == UNKNOWN && board[row][i + 2] == UNKNOWN) {
mark_square_as(board, size, row, i - 1, 2, announce);
mark_square_as(board, size, row, i + 2, 2, announce);
}
}
else if (board[row][i] == 1 && board[row][i + 2] == 1 && board[row][i + 1] == UNKNOWN) {
mark_square_as(board, size, row, i + 1, 2, announce);
}
}
for (int i = 0; i < size; i++) {
if (board[row][i] == 2 && board[row][i + 1] == 2) {
if (i + 1 == size - 1 && i - 1 >= 0 && board[row][i - 1] == UNKNOWN) {
mark_square_as(board, size, row, i - 1, 1, announce);
}
else if (i == 0 && i + 2 <= size && board[row][i + 2] == UNKNOWN) {
mark_square_as(board, size, row, i + 2, 1, announce);
}
else if (i - 1 >= 0 && i + 2 <= size && [row][i - 1] == UNKNOWN && board[row][i + 2] == UNKNOWN) {
mark_square_as(board, size, row, i - 1, 1, announce);
mark_square_as(board, size, row, i + 2, 1, announce);
}
}
else if (board[row][i] == 2 && board[row][i + 2] == 2 && board[row][i + 1] == UNKNOWN) {
mark_square_as(board, size, row, i + 1, 1, announce);
}
}
}
然而,当我尝试运行它时,答案在一些情况下不正确:(右侧是我的输出,左侧是正确的输出)
OXXO
XOXO
OXOX
XOOX
(my output said to mark (2nd row, 5th column) as X, when there is not even a fifth column)
O-
--
(my output said to mark (1st row, 2nd column) as X, when it should mark nothing)
OO-X--
X--X-O
------
X---OX
---XOO
-X-O-O
(my output said to mark (1st row, 3rd column) and (6th row, 5th column) as X, which is correct. But it didn't say to mark (1st row, 5th column) as O as it should because (1st row, 3rd column) would have also been marked).
我不确定我的代码出错了,非常感谢你。
答案 0 :(得分:0)
至少你忘记了这种情况:
else if (i - 1 >= 0 && i + 2 <= size && board[row][i - 1] == 2 && board[row][i + 2] == UNKNOWN)
(board[row][i - 1] == 2
可能是board[row][i - 1] == 1
,具体取决于您放置此行的位置。)
这就是为什么&#34;它没有说标记(第1行,第5列)为O应该&#34;
答案 1 :(得分:0)
对于带有特殊标记的周围板,代码变得更简单:
template <std::size_t H, std::size_t W>
void resolveCol(std::array<std::array<char, H>, W>& b)
{
for (std::size_t i = 1; i != W - 1; ++i) {
for (std::size_t j = 1; j != H - 1; ++j) {
if (b[i][j] == b[i + 1][j]) {
switch (b[i][j]) {
case 'X': { setBoard(b, i - 1, j, 'O'); setBoard(b, i + 2, j, 'O'); break;}
case 'O': { setBoard(b, i - 1, j, 'X'); setBoard(b, i + 2, j, 'X'); break;}
}
}
}
}
}
int main() {
constexpr std::size_t H = 4;
constexpr std::size_t W = 4;
std::array<std::array<char, H + 2>, W + 2> board{{
{{'B', 'B', 'B', 'B', 'B', 'B'}},
{{'B', '-', '-', '-', 'X', 'B'}},
{{'B', 'X', 'X', '-', '-', 'B'}},
{{'B', '-', 'X', 'X', '-', 'B'}},
{{'B', '-', '-', 'X', 'X', 'B'}},
{{'B', 'B', 'B', 'B', 'B', 'B'}}
}};
resolveCol(board);
}