
紫书第七章
accosmos
这个作者很懒,什么都没留下…
展开
-
UVA 725 Division(除法)
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2n79。题解:暴力破解枚举fghij。#include<iostream>#include <string>#include <string.h>#include<vector>#include<stack&g...原创 2018-11-06 10:13:08 · 300 阅读 · 0 评论 -
UVA225Golygons 黄金图形
题意:平面上有k个障碍点。从(0,0)出发,第一次走一个单位,第二次走2个单位,····第n次走n个单位,恰好回到(0,0)点。要求只能沿着东南西北方向走,且每次必须转弯90度(不能沿一个方向继续走,也不能后退)。走出的图形可以自交但不能经过障碍点,已经访问过的点不能再访问。输入n、k(1n20,0k50)和所有障碍点的坐标,所有满足条件的移动序列(用news,表示北、东、西、南),按照字典序从小...原创 2018-11-22 00:53:15 · 303 阅读 · 1 评论 -
埃及分数问题——迭代加深搜索
问题描述:在古埃及,人们使用单位分数的和(即1/a,a是自然数)表示一切有理数。例如,2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中不允许有相同的,则最小的分数越大越好。例如19/45=1/5+1/6+1/18是最优方案。分析:题目看似不难,但是有陷阱,没有给出深度,一味回溯,肯定出不来,作者给出的思路就是用迭代法,加剪枝。每次枚举深度上限,每次都判断是否比之前的解更小,每...原创 2018-11-17 11:58:00 · 601 阅读 · 0 评论 -
UVA211 TheDomino Effect 多米诺效应
题意:一副“双六”多米诺骨牌包含28张现给出一个排列,求其所有排列组合。输出所有可能的右图分析:有两种方法可做,区别就是搜索对象,第一种是搜索pips,每次只需要列举pips的两个编号即可,第二种是搜索bones每次都从列表中判断对应的序号是否还有。博主水平有限,第二种没做出来。以第一种情况分析,每次先搜索0~6,然后再搜索0~6对应的0~6。每次就纵坐标加一。#i...原创 2018-11-22 22:22:39 · 309 阅读 · 0 评论 -
UVA11212Editing aBook 编辑书稿
问题描述:你有一篇由n(n[2,9])个自然段组成的文章,希望将它们排列成1,2,、、、n。可以用Crtl+X和Ctrl+V快捷键来完成任务。每次可以剪一段连续的自然段,粘贴时按照顺序粘贴。注意,剪贴板只有一个,所以不能连续剪切两次,只能剪切和粘贴交替。例如,为了将{2,4,1,5,3,6}变为升序,可以剪切1将其放到2前,然后剪切3将其放到4前,再如,对于排列{3,4,5,1,2},只需要剪...原创 2018-11-18 00:17:53 · 318 阅读 · 0 评论 -
UVA12113 Overlapping Squares重叠的正方形 暴力破解
题意:给定一个4*4的棋盘,用不超过6个2*2的纸片堆放出给出的图案,问是否可行分析:题目很简单,不难想到枚举纸片位置,每张纸片有9中放置方法,只有6张纸片,可以断定不会超时。题目难点在于数据处理,又是数据结构知识,如何表示数据。开始我想把格子抽象到数组中,相同的格子用相同的数字表示,一共是4*4。然后直接搜索就完事了。数据转换部分: /*cout << " ...原创 2018-12-02 21:10:46 · 301 阅读 · 0 评论 -
UVA690 Pipeline Scheduling 流水线调度
题意:给出5个工作单元,有10个完全相同的程序需要执行,工作单元要避免冲突,问所有程序执行完所需的时间最短是多少?例:7X...XX..X.......X.......X.........X7代表时间片,每个工作单元调用次数不固定,工作单元不能冲突,此数据最短时间为34。分析:这个只能是暴力求解,但是容易超时,我的想法就是每次枚举它的偏移量,判断是否冲突,加上剪枝。但...原创 2018-12-01 22:03:09 · 300 阅读 · 0 评论 -
UVA - 1604Cubic Eight-Puzzle立体八数码
题意:有8个立方体,按相同颜色着色,相对面是相同颜色,按同一方向摆成3*3的方阵。问从初始状态到目标状态最少移动步数。分析:题目是最短路径题,可以bfs可以回溯,用回溯加剪枝。不能走的格子是上次走的空格。# include<iostream># include<cstdio># include<cmath># include<map>...原创 2018-12-08 12:28:19 · 292 阅读 · 0 评论 -
UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)
题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记。用最少的皇后守卫所有带标记的格子。皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限。分析:因为不知道深度,所以用迭代加深搜索,判断条件可以参照之前写的八皇后问题。具体就是回溯二分。# include<iostream># include<cstdio># include<c...原创 2018-12-08 23:33:53 · 154 阅读 · 0 评论 -
UVA12107Digit Puzzle数字字谜(迭代加深搜索)
题意:给你一个字谜,让你改最少的数,使等式有唯一解。分析:两次dfs,一次枚举改动,一次枚举所有解,判断是否有且仅有一个解。#include<cstdio>#include<cctype>#include<string>#include<string.h>#include<queue>#include<math....原创 2018-12-06 08:57:19 · 325 阅读 · 0 评论 -
UVA307 Sticks小木棍
题意:一开始有n根同样的小木棍,后来将其切成长度不超过50的小木棍,问原来小木棍最短长度是多少,例如砍完后有四根,长度分别为1,2,3,4,原来长度可能为5,或10。5是最小可能长度。分析:可以用深搜,因为它的组成长度可能性只是所有木棍长度总和的因数,所以可以直接dfs。注意剪枝,四个剪枝:1、当前枚举的长木棍长度不是小木棍长的和的因数时跳过。2、与当前小木棍长度相同的小木棍没有使...原创 2018-12-13 18:06:01 · 525 阅读 · 0 评论 -
UVA - 11882Biggest Number dfs+期望剪枝
题意:在一个R行C列(2=<R,C<=15,R*C<=30)的矩阵里有障碍物和数字格(包含1~9的数字)。你可以从任意一个数字格出发,每次沿上下左右的方向走一格,但不能走障碍格中,也不能重复经过,然后把沿途经过的所有数字连起来,问能得到的最大整数是多少?分析:题目很简单,但容易超时,必须加上预期剪枝,就是当前搜索的和它之后可能搜索的最大长度加起来是否超过当前最优解,如果相等就...原创 2018-12-13 23:21:06 · 126 阅读 · 0 评论 -
UVA - 12569 Planning mobile robot on Tree (EASY Version) BFS
题意:有一颗n个节点的树,其中一个节点有机器人,指定m个节点有障碍物,指定终点,问最少需要移动多少步才能到达,移动过程中遇到障碍物需要将其移动到空地。分析:bfs搜索,是每次都对障碍物进行移动,将障碍物移动到空闲地方,如果是机器人移动就需要更新位置。障碍物位置用二进制储存,方便查找,更新。# include<iostream># include<cstdio>...原创 2018-12-09 23:10:03 · 157 阅读 · 0 评论 -
UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)
题意:一共有15个洞,成三角形分布,有一个洞是空的,其余都是有一个小球,小球可以穿过一个或多个小球到空洞里,被穿过的小球就被拿走(注意,穿过的小球必须至少一个),最后只剩一个小球,且在开始时候的空位上,问最少多少步,结果按字典序最小输出。分析:此题不难想到用bfs搜索,数据储存是一个难点,数据成三角形,每一个点最多和6给点相邻。于是可以先列举这15个点的相邻节点,因为要按照字典序输出,所以方向...原创 2018-12-10 17:11:39 · 270 阅读 · 0 评论 -
UVA - 817According to Bartjens
题意:给出一串数字,向里面插入“*”,“+”,“-”,使式子等于2000,至少要插入一个运算符。分析:每个位置有4种情况不插入,“*”,“+”,“-”,最多有9个位置,每次枚举位置,最后判断输出。# include<iostream># include<cstdio># include<cmath># include<map># i...原创 2018-12-11 00:21:31 · 173 阅读 · 0 评论 -
UVA - 11694 Gokigen Naname(dfs)
题意:在一个n*n(n7)网格中,有些交叉点上有数字。你的任务是给每个格子画一条斜线(“/”和“\”),使得每个交叉点的数字等于和他们相连的斜线条数,且这些斜线不会构成环。分析:方法是dfs,交叉点数字解决方法是以放入“\”和“/”为搜索对象,方格的端的有数字就减一,没数字就剪枝,其中有很多剪枝,比如每当搜索完一个方格后,方格的左端点如果是数字,那么数字应该为0,依次类推,方格处于右端,左上应...原创 2019-01-13 01:12:39 · 387 阅读 · 0 评论 -
UVA - 10384The Wall Pushers推门游戏(迭代加深)
题意:从s处出发,每次可以往东南西北4个方向之一前进。如果前方有墙壁,可以把墙壁往前推一格。如果有两堵墙或者多堵墙,则不能移动,另外也不能推边上的墙。找出最短路径。分析:刚拿到题目肯定想到是bfs,但是由于地图较大,bfs超时#include<iostream>#include<time.h>#include<queue>#include<...原创 2019-01-25 17:26:24 · 263 阅读 · 0 评论 -
UVA1374 Power Calcilus快速幂计算
题目:输入正整数n(1n1000),问最少需要几次乘法可以从x得到?例如,需要6次:=x*x,,,,,,计算过程中,x应总是正整数。分析:每次可以从已经得到的状态数组中任选两个进行加法和减法,不能产生重复的数。可以剪枝,每次判断当前的当前的最大状态数*剩余深度后是否还比n小(n为所求数)也就是每次都最大状态相加,如果最后最大状态都满足不了,那么可以确定这个深度不够。代码:#inc...原创 2018-11-19 12:55:31 · 145 阅读 · 0 评论 -
UVA208Firetruck 消防车(图的路径搜索)
题意:输入一个n(n20)个节点的无向图以及某个结点k,按照字典序从小到大顺序输出从结点1到结点k的所有路径,要求经过结点不能重复经过。分析:终于做到水题了,此题唯一要点就是先判断是否能到达,用dfs。#include<cstdio>#include<cstring>#include<cctype>#include<queue>#i...原创 2018-11-21 19:38:19 · 326 阅读 · 0 评论 -
UVA1603Square Destroyer破坏正方形
题意:有一个由火柴棍组成的正方形网格,每条边有n根火柴,共2n(n+1)根。从上到下、从左到右给各个火柴编号。现在拿走一下火柴,问剩下的火柴中,至少还要拿走多少根火柴才能破坏正方形。分析:列举每种可能,显然是回溯,思想就是每次考虑一个没有被破坏的正方形,都被破坏就退出并更新当前最优解,就是深度。这题难点就是如何表示正方形,先将所有正方形枚举出来,将它的四条边存入数组,而它边的表示可以算出来。...原创 2018-11-21 18:26:34 · 397 阅读 · 0 评论 -
回溯法之八皇后问题
八皇后问题就是在一个8*8的棋盘上任何两列的行、列、对角线上都不允许有其他元素,问在棋盘上放8个棋子共有多少种放法?题目不难,想必很多人都有解决思路。但是你的解决思路是最简的吗?假如第一行放一个那么第二行有7种放法,然后第3行又有6种放法,以此类推,共有8!=40320个。递归都会写,关键是判断条件,如何简化判断。int tot = 0; int c[100];void sea...原创 2018-11-09 22:37:59 · 1486 阅读 · 0 评论 -
路劲寻找-八数码问题(判重)
题目:编号为1~8的8个正方形滑块被摆成3行3列(有一个格子留空)。把一种状态变成另一种状态最少移动多少步,到达不了,就输出-1。2 6 4 1 3 7 5 8 8 1 5 7 3 6 4 2 分析:题目就是一个bfs最短路径问题,关键是如何判断当前状态是寻找过的。作...原创 2018-11-12 22:52:46 · 351 阅读 · 0 评论 -
UVA524 PrimeRingProblem素数环
输入正整数n,把整数1,2,3,···n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n16。回溯法#include<iostream>#include <string>#include <string.h>#include<math.h>using namespace std;...原创 2018-11-10 11:15:16 · 272 阅读 · 0 评论 -
回溯法之避免无用判断 UVA129 Krypton Factor困难的串
题意:如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”输入正整数n和L,输出由前L个字符组成的并且它的字典序是第n小的串,和输出这个串的长度样例输入:7 330 3样例输出:ABAC ABA7ABAC ABCA CBAB CABA CABC ACBA CABA 28为了避免判断做无用功,每次都从尾部开始,枚举所有可能长度,在...原创 2018-11-10 14:36:52 · 188 阅读 · 0 评论 -
UVA140 Bandwidth带宽
给出一个图节点数为n(n8)让这些节点排序,使得节点的最大带宽要最小,最大带宽就是排列里面与节点相离最远的距离。有两种方法,第一,因为n比较小就可以枚举全部,然后一个一个的比较,还有一种就是边排列边比较。只要其中两个节点的距离大于目前最大,那么下面的排列可以直接省去。#include<cstdio>#include<cstring>#include<ve...原创 2018-11-10 20:35:45 · 254 阅读 · 0 评论 -
UVA11059 Maximun Product 最大乘积
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1n18,-10Si10。解题方法:暴力破解,列出所有子串长度,然后搜索,但是仅限这种题,因为长度很小,所以可以不考虑超时。#include<iostream>#include <string>#include <string.h>#i...原创 2018-11-07 22:29:51 · 220 阅读 · 0 评论 -
UVA10603 倒水问题
题意给出3个杯子,只有最后一个杯子装满水,问至少倒多少水才能使其中一个杯子里的水达到d升。分析:这题关键在于优先级队列,每次都要取倒水量最小的状态出来。#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include<iostre...原创 2018-11-13 07:38:12 · 223 阅读 · 0 评论 -
排列组合(可重复版)
#include<iostream>#include <string>#include <string.h>#include<vector>#include<stack>#include<queue>#include<stdio.h>#include<stdlib.h>原创 2018-11-08 13:38:20 · 1796 阅读 · 0 评论 -
子集生成方式
1.增量构造法void print_subset(int n, int* A, int cur) { for (int i = 0; i < cur; i++)printf("%d ", A[i]);//打印当前集合 printf("\n"); int s = cur ? A[cur - 1] + 1 : 0;//确定当前元素的最小可能值 for (int i = s; i &...原创 2018-11-08 19:45:30 · 169 阅读 · 0 评论 -
UVA1354天平难题 枚举二叉树
题意:给出房间宽度r和s个挂坠的重量wi。设计一个尽量宽(但宽度不能超过房间宽度r)的天平,挂着所有挂坠。天平由一些长度为1的木棍组成。木棍的每一端要么挂一个挂坠,要么挂另一个木棍,设n和m分别是两端挂的总重量,要让天平平衡,必须满足n*a=m*b。(0<r<10,1s6)。输出和标准答案的绝对误差不应该超过。分析:好了数值很小,可以暴力,问题是怎么枚举二叉树。这是本题的难点,...原创 2018-11-12 18:53:13 · 486 阅读 · 0 评论 -
UVA12325Zombie's Treasure Chest 宝箱
题意:给定两个箱子体积s1,s2,价值v1,v2,给出一个体积为V的宝箱,求可装入的最大价值。分析:正常写肯定是超时的,把状况简化,第一种,当s1,s2都很小时,就看它们的价值比,v1/s1 ,v2/s2当v1/s1>v2/s2时,就说明v1的价值更大,更多的搜索v1,v2宝箱最多搜索s1个。下面同理。第二种,当s1,s2都很大,s1>s2时,优先搜索s1,s1很快就能搜索完。...原创 2018-11-18 22:18:16 · 175 阅读 · 0 评论 -
UVA1601The Morning after Halloween 单向加双向bfs
题意:w*h(w,h16)网格上有n(n3)个小写字母(代表鬼)。要求把它们分别移动到对应的大写字母里。每步可以有多个鬼同时移动(均为往上下左右四个方向之一移动),但每步结束之后任何两个鬼不能占用同一个位置,也不能在一步之内交换位置。先来第一种单向bfs,需要注意的是如果像平常bfs判断的话,一定会超时,因为每个节点每次有5种移动方式,3个节点,最多有种情况,但是可以将空地拿出来,变成图。题目...原创 2018-11-14 21:25:21 · 214 阅读 · 0 评论 -
UVA1343 The Rotation Game旋转游戏
题目:如题,棋盘上由数字1,2,3组成,往A,B,C,D,E,F,G,H8个方向旋转棋盘,使得中间8个数相等,最多有几步。分析:这题关键在于最大深度的判断,有几个不等数字,就说明至少还需要移动几次,还有一个关键地方就是映射,将8个方向的旋转映射到一维数组。 00 01 02 0304 05 06 07 08 09 10 ...原创 2018-11-19 08:06:26 · 312 阅读 · 0 评论 -
UVA1602 Lattice Animals 网格动物
题目:输入n,w,h(1n10,1w,hn),求能放在w*h网格里的不同的n连块的个数(注意:平移、旋转、翻转后相同的算作同一种)。分析:本题关键就是如何判重,有n个格子连通,所幸n很小,可以回溯求解,将网格放到坐标系中,旋转就是将x=y,y=-x,平移就是最小的点与原点距离,然后每个点都减去它,翻转就是x=x,y=-y,然后再旋转。所以可以用set来判重。因为取值范围很小,所以可以打表,将每...原创 2018-11-21 14:15:06 · 220 阅读 · 0 评论 -
UVA - 11846 Finding Seats Again (DFS搜索对象)
题意:有一个n*n(n<20)的座位矩阵里坐着k(k26)个研究小组。每个小组的座位都是矩形形状。输入每个小组组长的位置和该组的成员个数,找到一种可能的座位方案。分析:方法肯定是用dfs,但根据搜索对象不同,可以简化搜索,我是以数字为对象进行搜索,结果却是超时。想想就纳闷,10秒竟然超了,虽然我没有剪枝。参考网上大佬方法,以空地作为枚举对象,每次寻找枚举行和列,当矩形里恰好有一个...原创 2019-01-09 23:43:05 · 339 阅读 · 0 评论