代码随想录算法训练营第三十天| 332.重新安排行程 51. N皇后 37. 解数独

332.

两个问题需要解决:一,不光要找行程,还要找最“小”的行程,也就是说我们要排序。二,找行程问题容易进入死循环,a-》b,b-〉a,a-》b。。。所以需要记录本次行程有没有被用过。如果记录的话,有可能出现循环,但不会出现永久循环,总会随着记录次数降为零而出循环。所以我们需要一个又能排序又能计数的datastructure。aka。multimap(multiset能排序但不能计数)。

这道题属于遇到一个合适的path就可以直接返回的,所以要返回bool。

注意判断ending condition的方法,我们有n段航程,要讲这些航程放到一条路里,所以其实有n个航程这条路就应该有n+1个起/终点代码随想录算法训练营第三十天| 332.重新安排行程 51. N皇后 37. 解数独_第1张图片

 计数这里很重要的一点,一定要pass in by reference,这样每次的改变才能被记下来,否则只是改变了本次function里面的那个copy

51.

小技巧:vector board(n, string(n, '.'));

n = 3的output:([...], [...], [...])

检查是否valid的function不容易写好,见图

首先只需要检查纵列的duplicate就行,横行不用是因为每次回溯都是在level + 1,已经不可能同行了

代码随想录算法训练营第三十天| 332.重新安排行程 51. N皇后 37. 解数独_第2张图片

 注意这里斜角的检查只需要检查row以上就行,下面还没回溯到

37.

这道题本质上还是一个找到符合条件path就直接返回的回溯,所以和332一样遵循

if (backtracking(board)) return true; 

的套路

ending condition不单独写出来,而是通过bool来最后返回一个值,true和false的位置都值得思考

forloop内部就属于正常判断,首先用两个forloop找到没被填上的空格,其次空格里能不能填某一个数字也要经过forloop(1-9),用isvalid ()

蛮复杂的,懒得写了,二刷的时候写吧

你可能感兴趣的:(算法)