UVa 1602 网格动物(回溯)】的更多相关文章

https://vjudge.net/problem/UVA-1602 题意:计算n连通块不同形态的个数. 思路: 实在是不知道该怎么做好,感觉判重实在是太麻烦了. 判重就是判断所有格子位置是否都相同,这样我们可以定义一个结构体来保存每个格子的坐标点,用set容器poly来保存这些格子,然后再用一个set容器poly_set来保存指定数量i个连通块的各个图形的坐标点,也就是说该容器是用来保存poly的.(不太好解释,具体可以看代码.)因为图形必须是连通的,所以在添加第i个格子的时候必定是在i-1…
题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭...QAQ~~ 这道题没什么好的办法,Polya定理也毫无用武之地,只能暴力构造出所有可能的连通块,然后用set判重,比较考验基本功. 连通块可以用一个结构体D来表示,D的n代表黑块数量,然后有至多10个点P(x,y),用另一个结构体数组P[N]来表示. 问题的关键在于如何判重. 首先要知道set是通过<…
Lattice animal is a set of connected sites on a lattice. Lattice animals on a square lattice are especially popular subject of study and are also known as polyominoes. Polyomino is usually represented as a set of sidewise connected squares. Polyomino…
题目 输入n.w.h($1\leqslant n \leqslant 10, 1\leqslant w,h \leqslant n$),求能放在w*h网格里的不同的n连块的个数(注意,平移.旋转.翻转后相同的算作一种).例如,2*4里的5连块有5种(第一行),而3*3里的8连块有以下3种(第二行),如图所示. 题解 判重部分有点难……茫然 看了紫书 平移可以强制整个图放左上角 旋转和翻转比较不好判断= = 因为旋转加翻转可能有多种情况(不知道有8种),害怕太慢不敢写 但输入比较少,直接打表 代码…
题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/9755147 因为节点数很少(小于20),所以可以先用floyd处理一下,判断一点是否能够到达终点 然后就像紫书里面枚举排列那样的去挨个找出字典序从小到大的路径 题解里面说到的无回溯的走遍和终点相连的所有点,他写的代码是判断的d[en][i],判断终点到i点是否可达 写成d[i][en]也能过,因为是无…
题目大意 输入n,w,h(1<=n<=10,1<=w,h<=n).求能放在w*h网格里的不同的n连块的个数(平移,旋转,翻转算一种) 首先,方法上有两个,一是打表,dfs构造连通块,枚举出来后再进行判重,另一种就是直接枚举每种连通块,保证每种连通块只枚举一次(这个方法还不会..但可以访问en.wikipedia.org/wiki/Polyomino 进行学习) 先看第一种方法: 1.如何构造连通块? 因为是构造连通块,所以就不能像寻找连通块或寻找路径那么做...一开始就犯了这种错误…
思路:得到输入得到mj[]的各个牌的数量,还差最后一张牌.直接暴力枚举34张牌就可以了. 当假设得到最后一张牌,则得到了的牌看看是不是可以胡,如果可以胡的话,就假设正确.否者假设下一张牌. 关键还是如何判断这组牌是不是可以胡.怎么判断呢?因为胡牌的条件是:nABC+mBBB+1DD, 而且n+m=4,其中n,m可以为0. 下面是一张:递归DD的牌的递归情况: 然后:依次是找顺子和刻子也是相同的算法 #include<iostream> #include<cstring> using…
多联骨牌的生成办法,维基上只找到固定的骨牌fix,而free的没有找到. 于是只好写个set判重的简单枚举了. 旋转的操作,可以在坐标轴上画个点,以原点为轴心,逆时针旋转90度,新的点的坐标为(-y,x).顺时针也差不多. 反转类似. 对于操作完的骨牌,还要进行标准化,取最小的横纵坐标为参考,求出新的坐标,以便于判断. 生成所有骨牌以后,预处理一下(一顿乱搞)就好了. #include<bits/stdc++.h> using namespace std; #define local ; st…
这道题想了很久不知道怎么设置状态,怎么拓展,怎么判重, 最后看了这哥们的博客 终于明白了. https://blog.csdn.net/u014800748/article/details/47400557 这道题的难点在于怎么设置联通的状态,以及怎么拓展判重 . (1)状态:这里状态先定义了一个格子cell, 有x和y坐标.然后set<cell>表示一个联通块, 再用set<set<cell>>表示n个连块可以组成的所有联通块, 这里是集合套集合. (2)拓展:每个格…
题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生成必将浪费很多时间) ② 判断是否生成了重复的n连块 存储 :首先先确定用什么结构来存储n连块的信息才能更好的进行操作,n连块是多个二维坐标的集合,所以这里先定义结构体 Cell {int x, int y} 表示坐标,然后将其塞到一个集合里面set<Cell>,n连块可能有不同的多种,所以这些n…
(百度百科连接) 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常稳定可靠,有关键的空间搜索算法,并使用汇编优化,可以处理50万级实体,图形的显示和处理效率比同类产品高出很多. 运行环境 支持32/64位系统:WinXp.Win2000.Vista.Win7.win8.Window server等网页使用,支持IE所有版本 支持语言 VC.VB.C#.Delphi…
如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常稳定可靠,有关键的空间搜索算法,并使用汇编优化,可以处理50万级实体,图形的显示和处理效率比同类产品高出很多. 运行环境 支持32/64位系统:WinXp.Win2000.Vista.Win7.win8.Window server等 网页…
 A Puzzling Problem  The goal of this problem is to write a program which will take from 1 to 5 puzzle pieces such as those shown below and arrange them, if possible, to form a square. An example set of pieces is shown here. The pieces cannot be rota…
UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers  into each circle separately, and the sum of number…
UVa 167 题意:八行八列的棋盘每行每列都要有一个皇后,每个对角线上最多放一个皇后,让你放八个,使摆放位置上的数字加起来最大. 参考:https://blog.csdn.net/xiaoxiede_wo/article/details/79973171 #include <iostream> #include <cstring> #include <iomanip> using namespace std; ][]; int ans; ][]; void dfs(i…
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=46  Meta-Loopless Sorts  Background Sorting holds an important place in computer science. Analyzing and implementing various so…
学习的紫书的回溯,理解起来还是好困难的说啊= = #include<iostream> #include<cstdio> #include<cstring> #include <cmath> #include<stack> #include<vector> #include<map> #include<set> #include<queue> #include<algorithm> us…
题意:给出n,把从1到n排成一个环,输出相邻两个数的和为素数的序列 照着紫书敲的, 大概就是这个地方需要注意下,初始化的时候a[0]=1,然后dfs(1),从第1个位置开始搜 #include<iostream> #include<cstdio> #include<cstring> #include <cmath> #include<stack> #include<vector> #include<map> #includ…
回溯法确实不是很好理解掌握的,学习紫书的代码细细体会. #include <cstdio> ]; int n, L, cnt; int dfs(int cur) { if(cnt++ == n) { ; i < cur; ++i) { == && i) puts(""); == && i) printf(" "); printf("%c", 'A' + S[i]); } printf("…
原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEFGZE的串,它们都有相邻的重复子字符串 字母的范围是L,既 'A'到'A' + L 分析: 大体上这是一道生成排列组合的题.难点在于我们如何判断当前生成的串是"困难的串" 我们首先采用递归按照字典顺序从小到大生成串, 那么每一次我们处理的都是前一个"困难的串", 既满足…
Description You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white. The coloring of the graph is called optimal if a maximum…
题目:跟N皇后问题一样,不考虑对角冲突,但考虑墙的存在,只要中间有墙就不会冲突. N皇后一行只能放一个,而这题不行,所以用全图暴力放棋,回溯dfs即可,题目最多就到4*4,范围很小. 刚开始考虑放一个棋子后就把其他不能放的地方标记下,然后再暴力,后来发现如果一个点重复标记在去标记时就会把点标成合法的,于是改用放棋子是进行检查,由于数据量小,也不会占用多少时间. 之后才想到,在标记时可以用累加的,去标记时再一个一个减下来即可... 代码: #include <cstdio> const int…
题意  把1到n这n个数以1为首位围成一圈  输出全部满足随意相邻两数之和均为素数的全部排列 直接枚举排列看是否符合肯定会超时的  n最大为16  利用回溯法 边生成边推断  就要快非常多了 #include<cstdio> using namespace std; const int N = 50; int p[N], vis[N], a[N], n; int isPrime(int k) { for(int i = 2; i * i <= k; ++i) if(k % i == 0)…
题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了,可以用并查集也可以用floyd算法,这样就能过了. 但是这个方法不是很完美的,如果两点之间只有一条线相连,而图又是稠密图,这样也很容易超时,数据强电就会挂掉. 可以把算法改进一下:是先从终点出发,无回溯的走遍和终点相连的所有点并标记,然后从起点出发,DFS判断下标记,这样就不会多走很多路了.另一个…
题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检查枚举的当前串是否为困难串的方法:将最后一个字母(下标为cur)与第cur-j个字母不断依次向前比较j个字母. 采用此种方法的原因是,前面的串都已经是回文串. 例如:ABAC,不需检查每个长度为偶数的串是否符合要求,因为枚举的每一步都保证是困难串,所以长度为2的串只需检查AC,无需检查AB,BA. #prag…
题目要求写一个直接用比较排序的pascal程序,挺有趣的一题. 我看题目数据范围就到8,本来以为贪个小便宜,用switch输出. 然后发现比较次数是阶乘级别的,8的阶乘也是挺大的,恐怕会交不上去. 于是改用回溯法. 其实他比较时就是把后面的数一个一个向前比较,然后插到那位前面,继续回溯. else的处理比较麻烦而已,改了好久终于跟标准答案一样了. 缩进没有处理,提交上去就ac了,看来oj没有检查缩进呢,如果有检查就还得处理一下了. 代码:(未进行缩进处理) #include <cstdio>…
骨牌无非两种放法,横着或竖着放,每次检查最r,c最小的没访问过的点即可.如果不能放就回溯. 最外面加一层认为已经访问过的位置,方便判断. #include<bits/stdc++.h> ; ; ; bool used[MAXB];// used Bone int pip[MAXP][MAXP];// pip 2 Bone ][]; ][]; int cnt; void dfs(int r,int c) { while(ans[r][c]) { ) { r++; c = -; } c++; }…
看到next_permutation好像也能过╮(╯▽╰)╭ 这题学习点: 1.建图做映射 2.通过定序枚举保证字典序最小 3.strtok,sscanf,strchr等函数又复习了一遍,尽管程序中没有实际用上 4.剪枝,或者回溯 #include<bits/stdc++.h> using namespace std; ][],deg[]; ][];//判读连通 ]; ]; int k; ]; int cnt; ]; ]; void dfs(int d,int width) { if(d ==…
题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”.例如,BB.ABCDACABCAB.ABCDABCD都是容易的串,而D.DC.ABDAB. CBABCBA都是困难的串.程序从输入中读取多行数据,每行包括两个整数n和L(即按此顺序给出),其中n > 0,L的范围是1 ≤ L ≤ 26.根据这些输入,程序要按照字母表升序打印出第n个“hard”字串(由字母表中的前L个字母构成),并在接下来的一行打印这个串的长度.按照上述规则,第一个串应该是“A”.对于…
题意:输入n,把1~n组成个环,相邻两个数之和为素数. 分析:回溯法. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<s…