看到题目首先想到的就是这是一个枚举的方式,能通过很多个for循环完成,但是比较麻烦。
这题可以使用回溯算法,可以先画出一个决策树,例如:
这样就可以得出:每轮选择会在choices当中选一个没有使用的数,所以我们需要一个bool类型的数组来标记这个位置是否被使用,如果被使用了,就进入下一个位置。直到选到没有被使用的位置。
然后还需要一个一维数组来存放不同情况的值,以及一个全局变量的二维数组来存放所有的值。
这个数组中如果存放了没有被使用的数之后,然后bool类型的数组中这个位置就用true来表示已经被使用,就要进行对下一个位置的判断,这个判断还是需要从下标0来开始判断,通过这一方法进行剪枝。如果一维数组(123)放满了之后,即可将这个值传给二维数组,然后返回到上一层。就是由第三轮回到第二轮,然后再对最后一个加入的数进行删除,变为12,然后这个位置上的数(3)就说明没有被使用了。然后进入下一个位置choice[3],如果下一个位置超出范围就返回,回到第一层,再将一维数组的最后一个值删除,变为1,然后把这个值(2)所在位置的bool变为true表示这个数组中没有使用,然后对下一个位置choice[2]进行判断,即又进入第二轮选择13,然后对123进行判断那个值没有使用,然后进入第三层变为132。
其中的递归函数就是为了解决当前节点,它应该干什么事情。
回溯就是用来解决干掉一维数组的最后一个元素,以及更改bool数组的值。
剪枝就是用bool数组来判断每个位置上的数。
递归出口就是当一维数组满了就返回