![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯
Joyyiwei
这个作者很懒,什么都没留下…
展开
-
uva 10123
题意:从一个木板中依次拿下木快,在这个过程中始终保持平衡(不一定是水平的才是平衡,纠结了好久),那如果按照题意直接来会很麻烦,所以我们想着依次放上去,让它保持平衡。参考了别人的优化:“第一,最好把坐标先乘2化成整数,这样就避免了浮点数误差。 “第二,我们在放的时候,一个贪心思路就是先把两个支点中间的木块放上,比较容易证明这样只会增加后续木板的稳定程度。 “第三,我们原创 2013-08-05 22:53:56 · 857 阅读 · 0 评论 -
uva 539
题意:在图上找出最长的路,简单的回溯#include #include #include using namespace std;const int MAXN = 30 ;int n,m,G[MAXN][MAXN],vis[MAXN][MAXN],maxNum;void dfs(int u,int num){ for (int v = 0 ; v < n ; v++) {原创 2013-08-11 16:38:44 · 665 阅读 · 0 评论 -
uva 10474
题意:找出所要求数字的位置#include #include #include #include using namespace std;int n,q;int a[10005];int b[10005];int main(){ int t = 1; while (scanf("%d%d",&n,&q)!=EOF && n+q) { for (int i = 0 ;原创 2013-08-11 16:39:36 · 695 阅读 · 0 评论 -
uva 307
题意 :觉得这里讲的蛮好的点击打开链接#include #include #include #include using namespace std;const int MAXN = 65;int n,sum,goal;int stick[MAXN];bool visit[MAXN];bool cmp(const int &a,const int &b){ retur原创 2013-08-12 14:56:19 · 1148 阅读 · 0 评论 -
uva 387
题意:给你几个拼图的碎片,问是否可以拼成4*4的正方形,我们从头(1,1)枚举每一个坐标,(注意会有超出4*4的情况,WA在这里),然后我们先判断放下这个碎片是否会冲突,如果不会的话,我们就记录这个碎片的方格数,最后,如果满足16的话,那么这种情况便是成立的,最后输出4*4 的每一个方格所代表的拼图#include #include #include using namespac原创 2013-08-12 19:32:05 · 796 阅读 · 0 评论 -
uva 185
题意:两个问题,一是:问你是否满足罗马数字的等式,二是:是否有阿拉伯数字满足等式,第一个问题的注意点是:如果后一个的字符所代表的数字比它大,那么这个字符将是减去的,而不是加,第二个问题:我是把所有出现的字符都记录下来,然后就是一个个的搜索,注意的是:第一个不能是零#include #include #include using namespace std;const int MAX原创 2013-08-12 14:22:39 · 830 阅读 · 0 评论 -
uva 529 迭代DFS
题意:就是在满足ak =ai +aj的情况下,是否能够得到n这个数,i , j 可以相等,首先要先确定最小的深度,对于这个问题我们每次都取最大的相加,就是2*max,这样就可以确定最小的深度了,然后就是一层层的尝试了,然后便是减枝,对于有些情况是,即便我们每次都取最大的相加到最后都是小于n,那么就可以减去这条路#include #include #include using namesp原创 2013-08-13 08:54:00 · 779 阅读 · 0 评论 -
uva 11210
题意:看了题解才明白题目可能胡的情况,要求让你在所有还能拿的牌中找出可能胡的牌,最简单的胡法是,在有对子的情况下,再找出三张相同的或者顺子#include #include #include using namespace std;const char* mahjong[] = {"1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",原创 2013-08-25 21:30:10 · 903 阅读 · 0 评论 -
FZU 2107 Hua Rong Dao
题意:求用4种类型的矩形拼成4*N的方法个数,其中2*2的必须且只能用到一次,回溯的尝试放的矩形,起初return的位置错了,注意我们每次只尝试放一种,且一定能放的下1*1的矩形(在满足题意的情况下),所以return要放在1*1的里面,起初我放在了两个for的外面破坏了递归的结构#include #include #include #include using namespace std原创 2013-11-27 13:12:20 · 1002 阅读 · 0 评论 -
HDU - 1175 连连看
题意:Description“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能原创 2014-03-19 20:47:36 · 744 阅读 · 0 评论 -
uva 10344
题意:给你一些数,问你是否能通过+ ,-, *,让结果等于23,注意的地方是:这些数可以任意排序 #include #include #include using namespace std;int a[5];int vis[5];int flag;void dfs(int cur,int sum){ if (cur == 5 && sum == 23) { f原创 2013-08-11 16:38:23 · 693 阅读 · 0 评论 -
uva 331
题意:求使序列变成递增序列,有几种交换方式,只能相邻的交换,简单的回溯就可以了#include #include#include #include #include using namespace std;int arr[10],n,brr[10];int step ;bool cmp(const int &a,const int &b){ return a<b;}原创 2013-08-11 16:38:14 · 742 阅读 · 0 评论 -
uva 167
题意:就是八皇后的加深而已 ,求最大值#include #include #include using namespace std;int a[9][9],vis[3][20],save[9],n,tot;void search(int cur){ int i ; if (cur == 8) { int sum = 0 ; for (i = 0; i原创 2013-08-11 16:37:43 · 699 阅读 · 0 评论 -
uva 208
题意:从起点到终点的路,有几条路径,单纯的深搜或广搜是不行的,因为这不再是简单图,可能存在环,所以我们的方法是,先从终点开始广度搜索,把可以到达的点标记,然后在从起点进行深搜#include #include #include using namespace std;const int MAXN = 22 ;int maps[MAXN][MAXN];int visited[MAX原创 2013-08-11 16:37:00 · 670 阅读 · 0 评论 -
uva 165
题意:在H张邮票,K种面值的情况下能确定的连续的最大邮票值是多少,第一种面值是1是一定的了,然后我们在已知面值的情况下能凑成的连续面值和范围,那么下一张我们能从这个范围里面选#include #include #include using namespace std;const int MAXN = 200;int h,k;int ans[MAXN],maxStampVal,st原创 2013-08-11 16:37:54 · 730 阅读 · 0 评论 -
uva 301
题目的意思是说列车从起始点开出的时候,他要收集每个站(包括起始站)的乘客的搭车订单,这些订单能够知道多少人从哪个站上车然后从哪个站下车。但由于列车载人的容量有限,它必须有所规划,即放弃有些站的订单票,在这样的情况下,求这列车能够得到的最大的利润值,单价是人从上车开始每经过一个站收权值为1的价格#include #include #include using namespace std;原创 2013-08-11 16:38:33 · 728 阅读 · 0 评论 -
uva 639
题意:在图上尽可能的放最多的车#include #include #include using namespace std;const int MAXN = 10 ;char s[MAXN];int n,set[MAXN][MAXN];bool place(int r,int c) // 检查(r,c)的前 r行 ,前 c 列{ for (int i = r ; i >原创 2013-08-11 16:39:12 · 664 阅读 · 0 评论 -
uva 193
题意:给你一张图染色。只有黑白两种,相连的点是不能都是黑色的(白色的可以),问你染黑色的最大数,并输出染黑色的点#include #include #include using namespace std;const int MAXN = 110;int m,n,k;int graph[MAXN][MAXN];int color[MAXN];bool vis[MAXN][MA原创 2013-08-11 16:37:12 · 674 阅读 · 0 评论 -
uva 140
题意:找出所有的排列中带宽的最小值,而每个排列的带宽是这个排列中最大的距离#include #include #include using namespace std;int map[30][30],n=0,m;int a[10],vis[10],check[30];int p[10],ans[10],Min;int dfs(int cur){ if (cur == m)原创 2013-08-11 16:37:26 · 692 阅读 · 0 评论 -
uva 10012
题意:让你求出能放下所有圆的最小矩形,刚开始是单纯的全排列然后在计算,找出最小值,但后来发现会有圆与圆相交的情况,所以我们必须保证当前要放置的圆的位置是与之前的所有圆相切所确定的位置的最大值,至于计算位置的方法就很简单了#include #include #include #include using namespace std;int vis[8],num;double a[8原创 2013-08-11 16:38:05 · 739 阅读 · 0 评论 -
uva 216
题意:求将所有点连起来的最短距离。。貌似用最小生成树会超时....用回溯减枝可以过,注意的是每次都要+16#include #include #include #include using namespace std;struct point{ int x,y;}p[10];int n;int a[10],b[10];double MIN ;int vis[10];原创 2013-08-11 16:39:26 · 825 阅读 · 0 评论 -
uva 10160
题意:求覆盖所有点的最小点的个数。。参考别人的减枝技巧:1. 对于每个点来说我们有选与不选的两种情况,每次如果增加完点之后,覆盖的个数没有增加,那么我们就剪掉2. 如果当前的服务站已经大于最小值,剪掉3. 比如说:我们已经判断到了第5个点,而之前的1还没有覆盖到,而与1的最大关联点小于5,那么1往后将不再被覆盖,那么这也是不成立的#include #include #inclu原创 2013-08-11 16:36:43 · 850 阅读 · 0 评论 -
UVA - 817 According to Bartjens
Description According to Bartjens The wide dissemination of calculators and computers has itsdisadvantages. Even students in technical disciplinestend to exhibit a surprising原创 2014-07-09 19:46:07 · 2244 阅读 · 0 评论