- 博客(91)
- 资源 (8)
- 收藏
- 关注
原创 【索引】Backtracking - Hard
AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 3. Brute Force::Backtracking - Hard10123 - No Tipping10160 - Servicing Stations197 - Cube185 - Roman Numerals307 - S
2014-08-30 19:04:05 1544
原创 UVA 565 - Pizza Anyone?
#include #include int main() { char str[50]; while (scanf("%s", str) != EOF) { int n, status, num, person[100][2] = {0}, Max = (1 << 16) - 1; for (n = 0; str[0] != '.'; n++) { for (int i =
2014-08-30 17:32:34 1875
原创 UVA 529 - Addition Chains
题目大意:给一个数字n, 然后输出一个元素个数最少的从1到n的序列(可能有多种方案,输出其中一种即可)。其中对于第k个数Ak, 它的值等于Ai+Aj( ) 。解题思路:迭代深搜的方法,先确定数的基数,就是说组成这个数最少需要几个数,例如1个数最大组成1, 2个数最大组成2, 而3个数最大为4(每增加一个数,最大值 * 2)一个很重要的剪枝,当当前第i个数,为k, k的在剩余
2014-08-30 09:00:25 1643
原创 FZU - 2064 找位置
#include int main() { int t; scanf("%d", &t); while (t--) { int arr[105][105] = {0}, n, m, w; scanf("%d%d%d", &n, &m, &w); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) sca
2014-08-29 19:05:21 1501
原创 HDU - 1175 连连看
#include int main() { int t; scanf("%d", &t); while (t--) { int arr[105][105] = {0}, n, m, w; scanf("%d%d%d", &n, &m, &w); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) sca
2014-08-29 18:55:28 1543
转载 搜索的不稳定性
没有这个,生活会更有趣 当你试图写很强或很完美的程序时,搜索的不稳定性就可能出现。有很多原因可以导致不稳定性,当我讨论搜索的诸多改进方法时,顺便讨论了它们是如何导致搜索不稳定的。其他我没有讨论的搜索技巧也必须考虑不稳定的可能。 不稳定的搜索会返回无效的值,你用(5, 25)的Alpha-Beta窗口会高出边界,因此你用(24, INFINITY)重新搜索,却低出边界。这不应该发生,因为高出边
2014-08-29 12:25:04 1714
转载 主要变例搜索
主要变例搜索dgf对Alpha-Beta的改进 主要变例搜索(PVS, Principal Variation Search)是提高“Alpha-Beta”算法效率的一种方法。 在Alpha-Beta搜索中,任何结点都属于以下三种类型: 1. Alpha结点。每个搜索都会得到一个小于或等于Alpha的值,这就意味着这里没有一个着法是好的,可能是因为这个局面对于要走的
2014-08-29 12:21:33 2799
转载 期望窗口
期望窗口是对迭代加深的改进。迭代加深的最简单的实现方法是这样的: for (depth = 1; ; depth ++) { val = AlphaBeta(depth, -INFINITY, INFINITY); if (TimedOut()) { break; }} 这里调用了一个“窗口”为正负无穷大的Alpha-Beta搜索,以假定返回值可能是很大的正数或负数。 假设下一次迭代时,搜
2014-08-29 12:18:49 1720
转载 空着裁剪
空着向前裁剪没有副作用即可获得额外的速度 空着向前裁剪(Null-Move Forward Pruning),运用可能忽视重要路线的冒险策略,使得国际象棋的分枝因子锐减,它导致搜索深度的显著提高,因为大多数情况下它明显降低了搜索的数量。它的工作原理是裁剪大量无用着法而只保留好的。 这个技术在很多刊物上报道过,但是使得大家都来关注空着的,则是由Chrilly Donniger发
2014-08-29 12:12:11 2700
转载 静态搜索
静态搜索 国际象棋中会有很多强制的应对。如果有人用马吃掉你的象,那么你最好吃还他的马。 Alpha-Beta搜索不是特别针对这种情况的。你把深度参数传递给函数,当深度到达零就做完了,即使一方的后被捉。 一个应对的方法称为“静态搜索”(Quiescent Search)。当Alpha-Beta用尽深度后,通过调用静态搜索来代替调用“Evaluate()”。这个函数也对局
2014-08-29 12:07:09 1896
转载 简介(二)
尽管我们已经讨论过Alpha-Beta搜索简单有效,还是有很多方法试图更有效地对博弈树进行搜索。它们中的大部分思想就是,如果认为介于Alpha和Beta间的评价是感兴趣的,而其他评价都是不感兴趣的,那么对不感兴趣的评价作截断会让Alpha-Beta更有效。如果我们把Alpha和Beta的间距缩小,那么感兴趣的评价会更少,截断会更多。 首先让我们回顾一下原始的Alpha-Beta搜索,忽略
2014-08-29 11:58:13 1703
转载 置换表
一个多功能的数据结构 国际象棋的搜索树可以用图来表示,而置换结点可以引向以前搜索过的子树上。置换表可以用来检测这种情况,从而避免重复劳动。如果“1. e4 d6 2. d4”以后的局面已经搜索过了,那就没有必要再搜索“1. d4 d6 2. e4”以后的局面了。 这个原因可能鼓舞着早期的电脑国际象棋程序的设计师们,而现在事实上这还是置换表的次要用途。在某些局面,例如在没有通路兵的王兵残局中,
2014-08-29 10:04:39 3967 1
转载 简介(三)
我还没有讲完Alpha-Beta呢,因为我的伪代码里包含神秘的“排序着法”还没有解释,暂时先扔在一边,在讲完散列技术后,我将继续这部分内容。 散列技术的思想非常简单,很多棋类会出现“置换”的着法,即着法顺序的不同会导致相同的局面。例如在国际象棋中,开局走“1. d4 Nf6 2. c4”和“1. c4 Nf6 2. d4”都会导致一样的局面(称为印度防御),白方两次进兵可以按不同的顺序走。再看一
2014-08-29 10:02:13 1670
转载 简介(二)
浅的裁剪 假设你用最小-最大搜索(前面讲到的)来搜索下面的树: 你搜索到F,发现子结点的评价分别是11、12、7和9,在这层是棋手甲走,我们希望他选择最好的值,即12。所以,F的最小-最大值是12。 现在你开始搜索G,并且第一个子结点就返回15。一旦如此,你就知道G的值至少是15,可能更高(如果另一个子结点比G更好)。这就意味着我们不指望棋手乙走G这步了,因为就
2014-08-29 09:59:39 1646
转载 简介(一)
搜索树 任何棋类游戏都要定义一棵有根的树(即“博弈树”),一个结点就代表棋类的一个局面,子结点就是这个局面走一步可以到达的一个局面。例如下图是井子棋(Tic-tac-toe)的搜索树: (实际上,这个搜索树的根结点应该有9个子结点,但是我去掉了一些对称的情况。如果同样的棋盘是由两个不同的着法顺序形成的,那么我们就建立两个结点,所以这的确是树的结
2014-08-29 09:55:10 1758
转载 最小-最大搜索
从浅显的地方开始 在国际象棋里,双方棋手都知道每个棋子在哪里,他们轮流走并且可以走任何合理的着法。下棋的目的就是将死对方,或者避免被将死,或者有时争取和棋是最好的选择。 国际象棋程序通过使用“搜索”函数来寻找着法。搜索函数获得棋局信息,然后寻找对于程序一方来说最好的着法。 一个浅显的搜索函数用“树状搜索”(Tree-Searching)来实现。一个国际象棋棋局通常可以看作一
2014-08-29 09:51:05 2459 1
转载 Alpha-Beta搜索
《对弈程序基本技术》专题 Alpha-Beta搜索 Bruce Moreland / 文 最小-最大的问题 Alpha-Beta 同“最小-最大”非常相似,事实上只多了一条额外的语句。最小最大运行时要检查整个博弈树,然后尽可能选择最好的线路。这是非常好理解的,但效率非常低。每次搜索更深一层时,树的大小就呈指数式增长。 通常一个国际象棋局面都有35个左右的合
2014-08-29 09:43:50 1714
转载 迭代加深
迭代加深 一个听起来不怎样的思想 如果你准备开始搜索一个国际象棋的局面了,你要搜索多深呢?事先预测搜索将进行多少时间,这有些困难,因为完成D层搜索所需要的时间取决于很多不确定的因素。在复杂的中局局面里,你可能不会搜索得很深,而在残局中你可能会搜索得非常深,在某些王兵残局里你可能会搜索100多层【译注:这也太夸张了点吧】。 有一个思想,就是一开始只搜索一层,如果搜索
2014-08-29 09:41:28 2387
原创 UVA - 519 Puzzle (II)
#include #include #include char pi[36][5], data[6][6][5];int num, vis[40], row, col;int cmp(const void*a, const void*b) { return strcmp((char*)a, (char*)b);}bool judge(int x, int y, int i)
2014-08-26 20:18:51 1578
原创 UVA 387 - A Puzzling Problem
#include int vis[4][4] = {0}, t = 0, n;struct Piece { int row; int column; char data[5][5];} pie[20];bool DFS(int cur) { if (cur == n) return true; for (int i = 0; i <= 4 - pie[cur].row
2014-08-25 16:25:29 1639
原创 UVA 307 - Sticks
#include #include #include using namespace std;int n, top, sum, Max, vis[105], part[105];int cmp(int a, int b) { return a > b;}bool DFS(int pos, int cnt, int lenth) { if (cnt == top) ret
2014-08-24 17:31:34 1637
原创 UVA 185 - Roman Numerals
#include #include int yes, len, count, change[200], vis[10] = {0};char str[100], letter[8] = {"IVXLCDM"}, record[8];bool judge() { int rec[200] = {0}, num[3] = {0}, cnt = 0; for (int i = 0; i
2014-08-24 00:27:58 1652
原创 UVA 10160 - Servicing Stations
#include #define ll long longlong long st[40], later[40];int num, n, m;bool DFS(long long build, int step, int cur) { if (build == ((ll)1 << n) -1) return true; if (step == num) return fal
2014-08-23 10:20:07 1688
原创 UVA 10123 - No Tipping
#include #include #include #include int cnt[3], cur[3];double wl1, wr1, wl2, wr2;struct Block { int pos; int w;} block[3][30], record[30], x;int cmp(const void *c, const void *d) { Bloc
2014-08-22 14:08:39 1569
转载 C style字符串
C style string(C风格字符串)的定义如下:C程序把指向以空字符结束的字符数组的指针视为字符串。在C++中,字符串字面值就是C风格字符串。C标准库定义一系列处理这种字符串的库函数,C++中将这些标准库函数放在cstring头文件中。由于C风格字符串本质上容易出错,C++程序应该优先使用C++标准库类string而少使用C风格字符串。C++标准库类string比C风格字符串更安全,效
2014-08-19 15:11:49 2699
转载 C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储与字符串相关的类容,以及提供各种有用的操作。标准库string类型的目的就是满足对字符串的一般应用。包含头文件
2014-08-19 14:57:53 1650
转载 C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件#include#include定义栈如下:stack stk;定义队列如下:queue q;栈提供了如下的操作
2014-08-19 14:43:54 3008
转载 图---邻接矩阵(建立,深度遍历,广度遍历)
图的存储方式可以用邻接矩阵来表示,我们假定顶点序号从0开始,即图G的顶点集的一般形式是V(G)={v0,vi,…,Vn-1}。以下代码测试过,为图的邻接矩阵表示方式。
2014-08-19 14:22:19 1778
原创 UVA 120 - Stacks of Flapjacks
题目大意:一摞盘子,从上到下。个数N:1~30,盘子直径D,1~100,求:每次只能执行从顶部到某一个的反转,也就是像堆栈一样,先倒出来,再倒回去,最终实现,从顶到底有序(升序)。输出每次反转的位置(即每次反转的底层位置),编号从底到顶从1~N。(没要求最优,能够实现就可以)。解题思路:模拟。
2014-08-19 11:01:54 1535
原创 UVA 10305 - Ordering Tasks
#include int main() { int n, m; while (scanf("%d%d", &n, &m), n) { int edge[105][105] = {0}, indegree[105] = {0}; for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); edge[a
2014-08-18 18:17:41 1616
转载 Toposort(拓扑排序)——DFS递归回溯版
拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。 拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。性质1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该
2014-08-18 16:23:58 2113
原创 UVA 10054 - The Necklace
#include #include int node[55], edge[55][55] = {0};int find_father(int x) { return x != node[x] ? node[x] = find_father(node[x]) : x;}int dfs(int cur) { for (int i = 0; i < 51; i++) if (ed
2014-08-18 14:45:40 1650
原创 UVA 10129 - Play on Words
#include #include int node[26];int find_father(int x) { return x != node[x] ? node[x] = find_father(node[x]) : x;}int main() { int t; scanf("%d", &t); while (t--) { int outdegree[26] =
2014-08-17 20:11:34 1563
转载 欧拉路与欧拉回路
对无向图: 定义:给定无孤立结点图G,若存在一条路,经过图中每条边一次且仅仅一次,该条路称欧拉路,若存在一条回路,经过图中每边一次且仅仅一次,该回路称为欧拉回路。具有欧拉回路的图称为欧拉图,不是柏拉图。定理:无向图G具有一条欧拉路,当且仅当G是连通的,且有0个或者是两个奇数度得结点。推论:无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数均为偶数。一笔画问题就是典型的
2014-08-17 16:23:59 1730
原创 UVA 10004 - Bicoloring
#include #include int edge[205][205], vis[205], flag, n;bool dfs(int cur, int color) { for (int i = 0; i < n; i++) if (edge[cur][i] && vis[i] == vis[cur]) flag = 0; for (int i = 0; i < n
2014-08-17 14:19:31 1632
原创 UVA 11205 - The broken pedometer
#include #include int main() { int t, vis[1<<15]; scanf("%d", &t); while (t--) { int LED[105] = {0}, n, m, num, ans = 20; scanf("%d%d", &n, &m); for (int i = 0; i < m; ++i) for (int j =
2014-08-16 16:36:44 1762
原创 UVA 639 - Don't Get Rooked
题目大意:给你一个#include char board[4][4];int ans, n, node[4][4];bool judge(int x, int y) { for (int i = x; i >= false && board[i][y] != 'X'; i--) if (node[i][y]) return false; for (int i = x
2014-08-15 19:37:47 1649
原创 UVA 167 - The Sultan's Successors
#include int board[8][8], vis[3][16] = {0}, max, t;void dfs(int cur, int sum) { if (cur == 8) max = (sum > max ? sum : max); else for (int i = 0; i < 8; i++) if (!vis[0][i] && !vis[1][i - cu
2014-08-15 15:22:52 1749
原创 UVA 208 - Firetruck
#include #include int edge[25][25], node[25] = {0}, road[25], valid[25], num, count;void check(int move) { valid[move] = 1; for(int i = 2; i <= 25; ++i) if(edge[move][i] && !valid[i]) chec
2014-08-15 11:31:34 1646
MyEclipse2015 Stable2.0补丁
2016-09-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人