![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Volume 3.1 Backtracking-Easy
文章平均质量分 59
深蓝色的猫
一个努力成长为大牛的蒟蒻程序媛
展开
-
UVa OJ 10344
1、回溯法,枚举运算符和操作数,不要忘记修改vis数组。 2、确确实实感觉到自己解题能力有所提高O(∩_∩)O~这么一道通过率不算高的题,竟然很快写出并一次AC。。。 #include #include using namespace std; int a[6],vis[6]; bool dfs(int num,int depth){ if(num==23&&depth==5原创 2013-10-01 18:24:24 · 292 阅读 · 0 评论 -
UVa OJ 301
1、拿到这道题的时候,我的第一个想法是像枚举子集一样枚举order,当所有都枚举完的时候再判断合不合法,交了后TLE了。 2、后来采取了优化策略,即如果枚举到一半的时候就已经发现方案不合法了,就直接回溯,不再搜索,相当于“剪枝”了。 3、优化后,出了一点小问题,就是“取消cap数组赋值”这个语句的位置,应该在if(flag)后,dfs(num+1)前,而不是if(flag)里面。(否则要是fl原创 2013-10-01 17:21:09 · 324 阅读 · 0 评论 -
UVa OJ 331
1、刚开始觉得这道题很复杂,其实只要模拟人类的“毫无逻辑的”思维即可。人类在排序的时候,难道不是随机地看到两个不符合条件的就交换吗?交换后,再从头扫描,发现不符合条件的,再交换。。。直到完全递增为止。刚开始我纠结于“最少交换次数”,其实,只要不故意重复(两个元素换来换去),这样的交换步骤就是最少的——有点贪心的意思在里头。 2、回溯法跟下棋很像,总是考虑一下这种可能性,再考虑一下那种可能性。。。原创 2013-10-01 23:04:11 · 382 阅读 · 0 评论 -
UVa OJ 639
1、用回溯法的时候犯了一个逻辑错误,即“填充”操作不一定是可逆的(举个反例,比如一个3*3的表格,在(0,0)处放置一个棋子,再在(2,2)处放置一个棋子,然后回溯的时候,用“填充成‘.’”的方式来释放(2,2)处的棋子,则会多删除(0,2)和(2,0),会造成潜在的错误。事实上,这两个点被“填充了两次”,也就是即使释放(2,2),这两个点依旧被(0,0)处的点所影响),应该用一个临时的数组b来保原创 2013-09-19 17:34:38 · 304 阅读 · 0 评论 -
UVa OJ 10474
1、这题用快排,危险地过了,用时1.332s,不知有什么更好的方法。 #include #include void Qsort(int a[],int s,int t); void change(int*a,int*b); int main(void) { int i,j,num,n,q,a[10000]={0},count=1; while(scanf("%d原创 2013-02-07 15:30:29 · 341 阅读 · 0 评论 -
UVa OJ 216
1、回溯法。。。没有什么难度,注意题目要求的单位是feet,在求了距离后要加上16才行。一次AC~ #include #include #include struct point{ int x,y; }; int n,vis[10],answer[10],s[10]; double dis[10][10],min; void dfs(int num){ double an原创 2013-09-18 23:29:43 · 324 阅读 · 0 评论 -
UVa OJ 539
1、这道题我刚开始是先Floyd,然后再挑出最长的一条,后来发现不对,因为题目并没有要求两点之间是最短路,而是一开始就要求是最长路。我思路一下子卡住了,上网搜了题解才发现原来就是单纯的dfs。。。囧。。。我怎么没想到——求无权图上的最长路,用dfs。。。 2、后来改了还是不对,仔细调试后发现我的思路错了:应该用vis数组来记录路过的边,而不是路过的点,因为假如记录路过的点的话,想象一个六边形,从原创 2013-09-19 21:11:29 · 299 阅读 · 0 评论 -
UVa OJ 167
1、就是个八皇后问题的变体,但是刚开始我忘记给max清零以及记错了右对齐输出的格式,WA了2次。 #include #include using namespace std; int C[8],a[8][8],max=0; void dfs(int num,int sum){ if(num==8){ if(sum>max) max=sum;原创 2013-10-29 22:49:20 · 283 阅读 · 0 评论 -
UVa OJ 10012
1、这道题的难点就在于“圆”,圆会相切,圆有大有小,所以要考虑各种情况。 2、用回溯法,每次添加一个新圆的时候,这个新圆可能与前面任一个圆重叠,所以要全部扫描一遍,求出位于最右边的圆心位置,存入b数组。 3、还要小心两端,每次添加新圆的时候,还要考虑是否和最左边的板重叠,而在计算最右边的板的位置的时候,要注意任何一个圆都可能与之相切。 #include #include #include原创 2013-10-29 22:01:13 · 317 阅读 · 0 评论