给定0和1的2d数组,使用回溯找到其中的所有正方形

时间:2016-12-13 12:30:44

标签: c++ arrays algorithm backtracking

在该2d阵列中的

1表示点,0表示空白区域。 例如这个数组:

1 0 0 0 1
0 0 1 0 0
0 0 0 0 0
0 0 0 0 1

我的答案应该是2,因为这个数组中有2个正方形(或矩形),如此

like this

应该使用所有点,并且你不能制作另一个正方形|矩形,如果它的所有点已经被使用(就像我们不能从中间的点到右上角的点创建另一个正方形),因为它们已经在其他正方形中使用过,你可以多次使用任何点如果至少有一个角没有使用点。 我可以解决它作为一个实现问题,但我不明白回溯是如何与这个问题相关的。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

回溯,让我们看一下你问题的另一个可能的答案,你列出了:

  • {0,0}至(2,1}
  • {0,0}至{4,0}

作为一种解决方案,另一种解决方案是(只要未使用一个点,就可以多次使用该点):

  • {4,0}到{2,1}(第一次使用4,0和2,1)
  • {0,0}到{2,1}(第一次使用0,0)
  • {0,0}至{4,4}(首次使用4,4)

这是3个动作,回溯它旨在显示使用递归的替代结果。在此等式中,如果您开始计算阵列不同区域的方块的起始位置,则可以获得不同的结果。

示例迭代从0,0开始,然后向右走过每一行,试图找到以[0,0]开头的所有可能的矩形,将给出你提供的解决方案,迭代从4,0开始,然后向左移动试图找到所有可能的解决方案的行将给出我的结果。