【发布时间】:2020-04-08 04:16:56
【问题描述】:
我正在尝试使用回溯方法找到熄灯游戏的解决方案。我无法理解此过程的算法。我的方法是枚举从 0 到 2n2 - 1 的所有整数,并将每个整数转换为具有 n*n 位的二进制数。然后,将其分成 n2 个二进制数字(0 表示关灯,1 表示开灯)并分配到一个 n × n 的网格中,例如: 我写了以下代码:-
void find_solution(int dest[][MAX_SIZE], int size) {
int y = pow(size,size);
int remainder;
for (int x = 0; x<pow(2,y); x++){
int i = 1;
int binary_number = 0;
int n = x;
while (n!=0) {
remainder = n%2;
n/=2;
binary_number += remainder*i;
i *= 10;
}
int binary_number_digits[size][size];
for (int k = 0; k<size; k++) {
for (int l = 0; l<size; l++) {
binary_number_digits[k][l] = binary_number%10;
binary_number/=10;
}
}
int count = 0;
for (int i = 0; i<size; i++) {
for (int j = 0; j<size; j++) {
if (binary_number_digits[i][j] == dest[i][j]) {
count++;
}
if (count <= 4 && count > 0) {
if (binary_number_digits[i][j] == 1) {
cout << i << j;
}
}
}
}
}
}
我已将十进制数字转换为二进制数字并将其存储在一个数组中并检查它们是否与随机生成的 n*n 网格匹配。如果它是 1,则打印该坐标(x,y)。任何人都可以帮我解决这个算法的问题。谢谢!
【问题讨论】:
-
这是你说的熄灯游戏吗? en.wikipedia.org/wiki/Lights_Out_(game)
-
嗨。如果您可以提供一些测试证据,即输入/输出/预期结果/实际结果,这可能会很有用。您可以考虑将代码分成更小的块,以便确定哪个部分不起作用。
-
@Atty 正确。但是,我正在为基本上 2*2、3*3 和 4*4 的网格实现这个游戏。
-
我不明白你的算法背后的想法。您基本上是在枚举所有可能的董事会状态。这如何帮助您确定必须按什么顺序将灯全部关闭?
-
你没有解释这个蛮力算法有什么问题(不是贪婪也不是回溯)。它可能很慢,但这个算法应该可以提供答案,除非实现存在问题。