
搜索
文章平均质量分 75
GooMaple
这个作者很懒,什么都没留下…
展开
-
UVa 110 - Meta-Loopless Sorts
实际就是求一个全排列,因为给出的数字最大是8,所以最多有8!种情况。 根据给出的样例我们可以将其看成向已给出的排列中倒叙插入新元素(其实就是插空),如:给出n=3,则最开始为 a,然后将b插入最后为ab,再插入c,为abc,c依次向前插入acb,cab,然后递归返回上一层,b向前移顺序变为ba,继而相继产生bac,bca,cba。 代码如下: #include #include #i原创 2012-08-27 21:01:50 · 1176 阅读 · 0 评论 -
UVa 321 - The New Villa
本来想用bfs(房间的状态)+dfs(灯的状态)+哈希的,但最后发现同一个房间可以反复进好几次以实现部分灯的开关,这样的话每一步都dfs其代价就会很大。参考了其他人的程序,用纯 bfs+哈希(记录状态共有10*2^10) 足矣。 代码如下: #include #include #include #include #include #include using namespace原创 2012-10-28 23:54:50 · 1116 阅读 · 0 评论 -
UVa 572 - Oil Deposits
图题里最简单的一个吧 ,DFS~ 代码如下: #include #include #include #include #include #include using namespace std; char a[100+2][100+2]; int flag[100+2][100+2]; void DFS(int x,int y) { if(!(a[x][y]-'*'原创 2012-07-31 09:55:10 · 1047 阅读 · 0 评论 -
UVa 657 - The die is cast
题还是蛮简单的,不过因为将main()函数的reture 0写到了while里,导致WA了好几遍,当时老纠结了,怎么看怎么对,但就是WA,哎,太粗心了~~~ 两次DFS,对骰子进行一次DFS,再对骰子里面的数字进行一次DFS ~ 代码如下: #include #include #include #include #include #include using name原创 2012-07-31 09:57:14 · 1434 阅读 · 0 评论 -
UVa 699 - The Falling Leaves
实质上是一个二叉树的DFS,先左子树,再右子树,因为题目说最大宽度为80,所以开一个80的数组,从中间(40)开始,往里递归。 以第二组数据为例, 8 2 9 -1 -1 6 5 -1 -1 12 -1-1 3 7 -1 -1 -1 开始a[40]=8,其左子树 2 (a[39]=2),右子树 3 (a[41]=3); 2的左子树为 9 (a[38]=9),右子树为6,则其右子原创 2012-07-31 09:59:05 · 1078 阅读 · 0 评论 -
UVa 705 - Slash Maze
将整个图像放大两倍后,其中间空格数恰好为所求空格数,注意整个图像外圈需要围上一圈"#"号以作边界;然后DFS 8个方向进行深度优先搜索,这里需注意,有对角线的四个方向需要特殊条件(判断是否相通)才可遍历,否则不遍历 ~ 代码如下: #include #include #include #include #define max 100+5 int num,max_l,t,fflag,vis[原创 2012-08-01 13:54:03 · 810 阅读 · 0 评论 -
UVa 188 - Perfect Hash
按照题目说的去模拟就可以,唯一值得注意的是,两个单词之间可能不止一个空格,因为这个RE了好几次。 代码如下: #include #include #include #include #include #include using namespace std; int main() { #ifdef test freopen("sample.txt", "r", st原创 2012-10-23 18:17:08 · 1368 阅读 · 0 评论 -
UVa 11218 - KTV
题意:让你从n种搭配中,选出3个,使得选出的9个数字巧好是“1~9”不重复,在所有符合条件的情况中输出分数最高的情况。 解法:dfs回溯,即:枚举出所有符合条件的情况从中选出分数最高的那个。 代码如下: #include #include #include #include #include #include using namespace std; int num, _ma原创 2012-11-01 17:51:46 · 1030 阅读 · 0 评论 -
2010年山东省第一届ACM大学生程序设计竞赛——Balloons
DFS水题。打选拔赛时的一个题,当时还没有开数据结构,所以没做上,今天看了看真是不难,AC掉了,也算是正式开图题的一个吧~~~ 代码如下: #include #include #include #include #include #include using namespace std; char a[100+2][100+2]; int flag_s[100+2][100+2],原创 2012-07-31 09:54:27 · 1550 阅读 · 0 评论 -
ZOJ 1354 Extended Lights Out
Extended Lights Out Time Limit: 2 Seconds Memory Limit: 65536 KB In an extended version of the game Lights Out , is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5原创 2012-08-01 14:19:40 · 1221 阅读 · 0 评论 -
UVa 10624 - Super Number
按题目要求,求出满足能整除相应n~m之间所有数的最小的整数X。 利用分步取余法取余+dfs,dfs时注意利用一些技巧减少取余算数的次数,否则会超时。 代码如下: #include #include #include #include #include #include using namespace std; int n, m, flag; char save[32]; vo原创 2012-11-03 22:42:59 · 1143 阅读 · 0 评论 -
UVa 439 - Knight Moves
第一个BFS,费了点时间~~ 题目本身就是象棋里马走“日”,每次共8种走法,记录走过的格子,有限次数内能搜到目标格 ~~ 代码如下: #include #include #include #include #include #include using namespace std; int a[10][10],flag[10][10],count; int step[原创 2012-07-31 09:56:12 · 944 阅读 · 0 评论 -
UVa 784 - Maze Exploration
DFS ~ 代码如下: #include #include #include #include #include #include using namespace std; char a[30+5][80+5]; int vis[30+5][80+5]; void DFS(int x,int y) { if(a[x][y]=='X'||vis[x][y]==1)原创 2012-07-31 09:58:12 · 851 阅读 · 0 评论 -
UVa 10267-Graphical Editor
简单的模拟+DFS题,注意初始化时像素为大写字母‘O’,而不是数字‘0’。还有就是注意需要保证 x1 代码如下: #include #include #include #include #include using namespace std; int m, n, vis[252][252]; char a[252][252], c, cc; void change(int &x原创 2012-09-04 18:22:00 · 939 阅读 · 0 评论 -
UVa 165 - Stamps
这个题题目大意就比较难理解。题意:给定 h(贴邮票位置数),k(允许使用的邮票面值数) (h+k 样例:h=3 k=2。若两种面值为1,3 则可以拼出 1,2,3,4,5 ,6 ,7 ,9 连续的最大和只到7。 因此输出: 1 3 -> 7 思路:数据量不大,可以一个一个数的往后推,首先,面值为1的邮票是必须选的,否则起码面值和“1”就凑不出来了。从1着手,其下一个数的取值范围必原创 2012-10-23 22:57:25 · 1338 阅读 · 0 评论 -
HDU 1518 - Square
使得给出的若干木棍可以拼出正方形,搜索回溯,注意剪枝。 代码如下: #include #include #include #include #include using namespace std; int num, lenth; int a[21], cct; bool vis[21], flag; int cmp(const void *x, const void *y) {原创 2013-02-02 22:45:33 · 799 阅读 · 0 评论 -
UVa 11624 - Fire!
bfs,稍复杂的bfs,将火和人的位置分别bfs(先火再人),直到人到达边界或是被火围住无路可走时结束。 代码如下: #include #include const int MAXN = 1001; struct point { int x, y, mem_step; bool bool_fire;// 区分是否是‘火’ } que[MAXN*MAXN]; int r,原创 2013-02-07 18:25:09 · 1935 阅读 · 0 评论 -
UVa 532 - Dungeon Master
BFS ~不解释。 代码如下: #include #include #include #include #include #include using namespace std; const int MAXSIZE = 1000003; int l, r, c, fl, fr, fc, dis[MAXSIZE]; int p1[6] = {1, -1, 0, 0, 0, 0};原创 2012-10-30 18:31:08 · 918 阅读 · 0 评论 -
UVa 141 - The Spot Game
题意实际上要求每次比较四个图形(其中三个是旋转翻转得到的),然后通过比较如果这四个图形之前都没有出现过,则将这四个图形全部存起来,以备以后进行比较(还有一点需要注意的,就是如果原图形经过旋转得到的图形和原图形相同,这种情况是不算重复的)。刚开始理解成每次几个比较完之后只把原图形存起来了,WA了好几次。方法:因为数据量较小,直接将二维图存成一维数组,然后暴力枚举比较就可以。 代码如下: #i原创 2012-10-19 22:02:00 · 1093 阅读 · 0 评论 -
UVa 10012 - How Big Is It?
以为很简单,十分钟敲了一个全排列回溯,结果WA了。想了半天,才想到可能存在两个半径很大的圆相切,中间夹着很多小的圆(这样单纯的全排列只判断相邻两圆的话就可能出现圆圆相交的情况),这样就需要加一个圆心坐标和一个原点记录位置来做特判,令当前放置的圆与前面所有的圆相切求出最大的据原点的距离(这样就可以保证排除圆圆相交的情况),再加上前面的距离即为放置这个新的圆的位置坐标。 代码如下: #incl原创 2012-09-12 18:26:37 · 1395 阅读 · 0 评论 -
UVa 167 - The Sultan's Successors
经典“八皇后问题”,把所有情况全部遍历一遍,统计最大值即可。 代码如下: #include #include #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原创 2012-08-31 18:04:39 · 1662 阅读 · 0 评论 -
UVa 639 - Don't Get Rooked
类似“八皇后问题”,但加了“墙”的概念,如果有墙相隔,则同一行墙两边可同时存在两个元素。 枚举子集+判断可行性,在枚举子集时,可以进行适当剪枝,如此可以减少很多不必要的枚举,比如:当n == 4时,其最大的的“车”的位置为8个,则我们可以加一个计数器,最多将子集的枚举量设为8,超过8则不再往子集中加入元素。 代码如下: #include #include #include #inc原创 2012-08-29 19:06:16 · 1122 阅读 · 0 评论 -
UVa 131 - The Psychic Poker Player
一手牌(规则请见:http://dpk888.com/school/discussions/%E4%B8%80%E6%89%8B%E7%89%8C%E7%9A%84%E7%89%8C%E5%9E%8B-poker-hands#per_page=10),枚举 + 模拟,关键是明白其桌子上的牌相当于一个栈,只有丢掉手里相应数量的牌才可以从栈中依次抽出相应数量的牌来维持手里始终有五张牌,依此枚举。原创 2012-08-21 16:55:01 · 677 阅读 · 0 评论 -
UVa 10400 - Game Show Math
DFS+剪枝。因为题目中要求每一步运算的范围都不会超过-32000~32000这个区间,因此可以将每一步运算的状态存在一个vis数组里,只要重复则不必要再往下计算,这样就可以将3的99次方的运算量降为99*4*64000。 代码如下: #include #include #include #include #include #include using namespace st原创 2012-09-11 16:29:44 · 769 阅读 · 0 评论 -
UVa 331 - Mapping the Swaps
回溯即可(注意题意是只能交换相邻的两个元素)。 代码如下: #include #include #include #include #include #include using namespace std; int a[6], b[6], cct, fct, n; void dfs(int cur, int fi) { if(cur >= fct) {原创 2012-09-10 22:23:43 · 595 阅读 · 0 评论 -
UVa 193 - Graph Coloring
回溯,枚举所有点的黑白情况,然后判断可行性。 代码如下: #include #include #include #include #include #include using namespace std; int map[102][102], node[102], save[101], n, k, cct; int judge(int cur) { for(int i原创 2012-09-08 09:23:14 · 1164 阅读 · 0 评论 -
UVa 10344 - 23 out of 5
开始用的回溯TLE了,后来改用全排列+DFS AC。 代码如下: (0.728s): #include #include #include #include #include #include using namespace std; int a[5], flag; void solve(int cur, int sum) { if(cur == 5) {原创 2012-09-05 20:41:15 · 1390 阅读 · 2 评论 -
UVa 301 - Transportation
枚举子集+回溯。枚举子集时,需要在每一次递归的过程中进行条件判断,而不能按一般情况放到最后进行判断。 代码如下: #include #include #include #include #include using namespace std; int n, m, num, _max, cal[8]; struct point { int start, des, ticket原创 2012-09-04 21:20:28 · 905 阅读 · 0 评论 -
UVa 539 - The Settlers of Catan
搜索回溯。其实本来是比较简单的一个题,但因为看错题,刚开始做麻烦了,不过也AC了,觉得程序跑的有点慢,所以看了一下其他人写的代码,结果发现自己审错题想麻烦了。 题目中不会出现两个点之间出现多条重复边的情况,而我刚开始考虑到这种情况,由此便不能用二维数组 vis[x][y] 的方式表示某两点之间的边是否访问过,我是用了一个一维数组将所有边都存起来然再处理的,这样过程中会非常的麻烦。而如果不考虑两点原创 2012-08-31 22:19:03 · 720 阅读 · 0 评论 -
UVa 216 - Getting in Line
乍一看,像最小生成树,实际不用,因为数据量较小(最大8台电脑),所以直接模拟全排列算最小值就可以。 代码如下: #include #include #include #include #include using namespace std; struct point { int x, y; } po[10]; int n; double save_d[10], dis原创 2012-08-28 19:27:19 · 996 阅读 · 0 评论 -
UVa 11205 - The broken pedometer
求可区分出所有行的最小列数,用位向量法生成子集,然后枚举最小子集。最需要注意的是其0与1之间可能不止一个空格,开始用char型数组 scanf("%c%c", &a[i][j], &c); 读取的,因为这个WA了好几次,如果直接用int型数组求则可以省去很多麻烦。 代码如下: #include #include #include #include #include #includ原创 2012-08-21 11:22:53 · 1206 阅读 · 0 评论 -
UVa 140 - Bandwidth
全排列,统计记录每个排列中“带宽”最大的值,最后输出所有最大值中最小的那个。 代码如下: #include #include #include #include #include #include using namespace std; int cct, ahl[27], map[27][27]; int save[9], node[9]; char a[500]; int原创 2012-09-12 23:11:08 · 2080 阅读 · 1 评论 -
UVa 208 - Firetruck
总体思路很简单,回溯,但直接用矩阵回溯会TLE。因为可能在1与目标点之间不存在通路(即:1 与 目标点分别存在于两个隔绝的联通图中),这样如果直接从1开始往下回溯,会无谓检查到许多无用的点浪费时间,我们可以先将所有与目标点联通的点存于一个数组中,仅在这个数组中查找,就省去很多无谓的查找时间。 代码如下: #include #include #include #include #in原创 2012-09-15 16:12:03 · 1679 阅读 · 0 评论 -
UVa 10001 - Garden of Eden
这个题难点在理解题意,读了n遍都没有读懂,最后看的结题报告上的解释才明白它的意思。 题意:一共有256种自动机的编译形式,给你其中一种,你可以相应转换为对应的二进制数字串(即为表格中的一个New State),再根据这个标准编译串(New state)将给出的串逆转换,如果能逆转换成一个符合要求的新串则说明存在串可以转换为给出的串,则输出“REACHABLE”,否则不存在,输出“GARDEN O原创 2012-09-19 22:19:43 · 1748 阅读 · 1 评论 -
HDU 4403 A very hard Aoshu problem
回溯,两个数字之间标记0,1,最后将标记1的位置放‘+’号,‘0’的位置处两边数字合成一个数,最后将每两个数之间放等号,检查是否相等。 代码如下: #include #include #include #include #include #include using namespace std; int len, num[16], vis[16], cct; char a[16原创 2012-09-25 12:08:51 · 1027 阅读 · 0 评论 -
CodeForces 128A
A. Statues time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output In this task Anna and Maria play a game with a v原创 2013-02-07 18:19:46 · 1143 阅读 · 0 评论